Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 斯威夫特希望#选择器的参数暴露于Objective-C_Ios_Objective C_Xcode_Swift - Fatal编程技术网

Ios 斯威夫特希望#选择器的参数暴露于Objective-C

Ios 斯威夫特希望#选择器的参数暴露于Objective-C,ios,objective-c,xcode,swift,Ios,Objective C,Xcode,Swift,我有一个Swift项目,我想将一个方法附加到UIButton的点击事件。我有以下代码: class MyClass { let myButton = UIButton(frame: CGRectMake(50, 50, 100, 50)) init() { myButton.addTarget(self, #selector(self.didTap(_:)), forControlEvents: .TouchUpInside) } func didTap(sender:

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

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
中,就像它所建议的那样,那么一切正常

我的构建设置中是否启用了导致这种奇怪行为的东西

另外,我在7.3.1中得到了这种行为。但是,如果我在7.2.1中尝试这一点,它不接受
#选择器(方法(:)
语法,
选择器(“方法”)
工作正常

如果我像建议的那样在func
didTap
中添加@objc前缀,那么一切正常

我的构建设置中是否启用了导致这种奇怪行为的东西

不,你看到的是正常的。选择器是Objective-C特性,使用选择器向类实例发送消息也是如此。Objective-C发送该消息的唯一方式是它是否可以看到您的类或方法本身。MyClass本身不是从NSObject派生的,所以Objective-C无法看到它。因此,如果您不想从NSObject派生它,您至少必须通过使用
@objc
标记将该方法公开给Objective-C

选择器(“方法:”)工作正常


在Swift的早期版本中,编译器在这种情况下不会帮助您,因此您的代码将被编译。但是当消息到达并且Objective-C找不到方法时,您就会崩溃。
#选择器
语法的全部要点是帮助您避免崩溃。这就是它所做的

选择器是Objective-C的一项功能,只能与暴露于动态Obj-C运行时的方法一起使用。不能将选择器设置为纯Swift方法

如果您的类继承自
NSObject
,那么它的公共方法将自动公开给Obj-C。由于您的类不是从
NSObject
继承的,因此必须使用
@objc
属性来指示您希望将此方法公开给Obj-C,以便可以使用Obj-C选择器调用它


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

您必须从
NSObject