Swift 希望 #selector 的参数暴露给 Objective-C
在 Swift 编程语言中,有一个非常有用的特性被称为 #selector,它可以让我们动态地将方法绑定到一个特定的选择器(selector)。然而,这个特性在与 Objective-C 交互时存在一个小问题:参数的类型信息在 Objective-C 中是不可见的。为了解决这个问题,Swift 团队希望能够让 #selector 的参数暴露给 Objective-C,以便更好地利用这个特性。问题背景在 Objective-C 中,选择器(selector)是一种用来标识方法的特殊类型。选择器由方法名和参数类型组成,用于在运行时动态地调用方法。而在 Swift 中,我们可以使用 #selector 来获取一个方法的选择器,例如:@objc func buttonTapped(sender: UIButton) { // 按钮点击事件处理}let selector = #selector(buttonTapped(sender:))然而,当我们在 Objective-C 中使用这个选择器时,我们只能获取到方法名,而无法获取到参数类型信息。这是因为 Swift 中的方法参数类型是使用编译时的类型推断来实现的,而在 Objective-C 中,方法参数类型是必须显式声明的。因此,Objective-C 无法根据选择器获取到方法的参数类型信息,这给一些需要在运行时动态地调用方法的场景带来了一定的限制。解决方案为了解决这个问题,Swift 团队希望能够让 #selector 的参数暴露给 Objective-C。他们提出了一个新的属性包装器 @convention(selector),可以用来将 Swift 方法参数的类型信息暴露给 Objective-C。使用这个属性包装器,我们可以在 Swift 中定义一个方法,将其标记为 @convention(selector) 类型,然后在 Objective-C 中使用这个方法的选择器时,就可以获取到参数的类型信息了。下面是一个示例代码:swift@objc @convention(selector) dynamic func buttonTapped(sender: UIButton) { // 按钮点击事件处理}let selector = #selector(buttonTapped(sender:))在这个示例中,我们将 buttonTapped(sender:) 方法标记为 @convention(selector) 类型,然后在 Objective-C 中使用 #selector 获取选择器时,就可以获取到参数类型信息了。这样一来,我们就可以更方便地在 Objective-C 中动态地调用 Swift 方法了。通过使用 @convention(selector) 属性包装器,Swift 团队希望能够让 #selector 的参数暴露给 Objective-C,以便更好地利用这个特性。这个改进可以使得在 Objective-C 中动态地调用 Swift 方法更加方便,为开发者提供更多的灵活性和便利性。在今后的 Swift 版本中,我们可以期待看到这个特性的实现,并享受到更好的编程体验。