Objective-C 和 Swift 在底层使用的是两套完全不同的机制,Cocoa 中的 Objective-C 对象是基于运行时的,遵循了 KVC (Key-Value Coding,通过类似字典的方式存储对象信息) 以及动态派发 (Dynamic Dispatch,在运行调用时再决定实际调用的具体实现).而 Swift 类型的成员或者方法在编译时就已经决定,而运行时便不再需要经过一次查找,而可以直接使用。
当要使用 Objective-C 的代码或者特性来调用纯 Swift 的类型时候,会因为找不到所需要的这些运行时信息,而导致失败。解决方法是,在 Swift 类型文件中,将需要暴露给 Objective-C 使用的任何地方 (包括类,属性和方法等) 的声明前面加上 @objc 修饰符。这个步骤只需要对那些不是继承自 NSObject 的类型进行,如果用 Swift 写的 class 是继承自 NSObject 的话,Swift 会默认自动为所有的非 private 的类和成员加上 @objc。这就是说,对一个 NSObject 的子类,只需要导入相应的头文件就可以在 Objective-C 里使用这个类了。
网友评论