尝试通过快速桥接标头调用扩展方法时,无法识别的选择器发送到实例

Sen*_*ful 2 objective-c ios unrecognized-selector swift objective-c-swift-bridge

我试图从Swift调用Objective-C代码.我创建了一个Swift Bridging Header,并在Objective-C文件中添加了一个导入(例如#import "UIColor+Utils.h").

该项目构建,我甚至得到代码完成,但当它试图执行该行代码时,它崩溃并说unrecognized selector sent to class.

我做错了什么?

(Xcode 6.2,iOS 8.2)

Sen*_*ful 12

当您尝试从包含在桥接头中的文件调用扩展方法但未添加到正确的目标时,会导致此问题.

要解决此问题,请确保该文件是与当前正在运行的目标相同的目标的成员.

例如,如果您尝试UIColor+Utils.m从WatchKit扩展中调用Objective-C代码(例如),则.m文件(例如UIColor+Utils.m)必须在其目标成员资格部分中具有WatchKit扩展.

有关更多信息,请参阅下文.


如果在文件中包含.h文件Bridging-Header.h,但忘记将文件添加到目标,则会出现以下行为.

如果您尝试在自己的类上调用方法(例如ABCClass.doSomething()):

  • 您将获得代码完成.
  • 你会得到一个构建错误:Undefined symbols for architecture x86_64.

如果您尝试调用类扩展方法(例如UIColor.doSomething()):

  • 您将获得代码完成.
  • 您不会收到任何构建错误/警告.
  • 当试图执行该行时,您将崩溃:unrecognized selector sent to class.