当前位置: 首页 > 面试题库 >

Swift希望将#selector的参数公开给Objective-C

晋奕
2023-03-14
问题内容

我有一个Swift项目,我想在其中将方法附加到UIButton的tap事件。我有以下代码:

class MyClass {
  let myButton = UIButton(frame: CGRectMake(50, 50, 100, 50))
  init() {
    myButton.addTarget(self, #selector(self.didTap(_:)), forControlEvents: .TouchUpInside)
  }

  func didTap(sender: UIButton) {
    print("Tapped")
  }
}

XCode突出显示了我的addTarget说法,并说:

Argument of '#selector' refers to a method that is not exposed to Objective-C

如果我@objc按我的func didTap建议添加前缀,则说明一切正常。

我的构建设置中是否启用了某些导致这种奇怪行为的功能?

PS。我在7.3.1中得到了这种行为。但是,如果我在7.2.1中尝试此方法,则它不接受#selector(method(_:))语法,并且Selector("method:")工作正常。


问题答案:

选择器是Objective-C的功能,只能与动态Obj-C运行时公开的方法一起使用。您不能为纯Swift方法选择器。

如果您的类继承自该类,NSObject则其公共方法将自动暴露给Obj-C。由于您的类没有继承自您的类,因此NSObject您必须使用@objc属性来指示您希望将此方法公开给Obj-C,以便可以使用Obj-
C选择器对其进行调用。

#selector()是Swift 2.2中的新语法。它允许编译器检查您要使用的选择器是否确实存在。旧的语法已被弃用,并将在Swift 3.0中删除。



 类似资料:
  • 问题内容: 新的Xcode 7.3通过addTarget传递参数通常对我有用,但在这种情况下,它会在标题中引发错误。有任何想法吗?当我尝试将其更改为@objc时,它将引发另一个 谢谢! 它正在调用的选择器 问题答案: 就我而言,选择器的功能是。一旦我删除错误消失了。同样适用。 在Swift 4中, 您将需要添加到函数声明中。直到快速4,这是隐式推断。

  • 问题内容: 我正在尝试调用webservice方法并将参数传递给它。 这是我的网络服务方法: 这是我的目标C代码: 因此,当我致电GetHelloWorld时,它的效果很好,并且: 显示HelloWorld,但是如何调用GetHelloWorldWithParam?如何传递参数? 我尝试: 并将以下两行添加到请求中: 我有错误: 谢谢您的帮助!泰迪熊 问题答案: 我已经使用了您的代码并进行了一些修

  • 问题内容: 有没有办法编译本机C或C ++代码并将其公开给Linux上的Swift?我可以看到像libdispatch这样的几个Apple库都是用纯C语言编写的,您只需导入即可在Swift中访问它们。 举个例子,假设我有两个文件,并且定义了名为的结构。有没有一种方法可以通过编写import语句来编译它们并在Swift中使用它们? 我试着写文件里面目录下,并且文件位于: 和运行。此产量错误: 我正在

  • 问题内容: 我正在尝试创建一个in,但是遇到了一些麻烦。 是同一个类中的函数。 我在编辑器中遇到错误: 找不到接受提供的参数的’init’的重载 当我更改为错误时消失。 我试过了: 但是没有任何效果,我在参考文献中找不到解决方案。 问题答案: Swift 本身 不使用选择器-在Objective-C中,使用选择器的几种设计模式在Swift中的工作方式有所不同。(例如,在协议类型或/ 测试上使用可选

  • 问题内容: 我正在按照本指南将我的React-Native 0.33代码桥接到一个超级简单的Swift方法,但我得到的只是。 这是我的代码: SwitchManager.swift SwitchManagerBridge.h SwitchManager-Bridging-Header.h 然后在我的文件中,使用导入SwitchManager 并调用。这是发生错误的地方。 不知道怎么了。 问题答案:

  • 问题内容: 所以我试图理解: 在: 在: 如果用作关键字参数,该消失: 在: 是什么原因造成的? 问题答案: 确实与这无关。您实际上是这样调用函数的: Python首先满足位置参数,而您的第一个参数是。然后,应用关键字参数,并 再次 提供。 无法检测到您已经提供了第一个位置参数作为关键字参数。通过用关键字参数替换位置参数,不会增加您的通话次数。 在混合使用位置参数和关键字参数时,必须注意不要重复使