- 今天隔壁老王突然问起我,Swift里面的@objc是个神马玩意儿?于是就有了今天的这个tip。
- 那么话说回来,既然说到@objc,就不得不扯一扯Swift和Objective-C之间不得不说的一些事啦^_^
Objective-C和Swift混合开发
Swift 语言的初衷是希望能摆脱 Objective-C 的沉重的历史包袱和约束,但是不可否认的是经过了二十多年的洗礼,Cocoa 框架早就烙上了不可磨灭的 Objective-C 的印记。无数的第三方库是用 Objective-C 写成的,这些积累无论是谁都不能小觑。因此,在最初的版本中,Swift 不得不考虑与 Objective-C 的兼容。
Apple 采取的做法是允许我们在同一个项目中同时使用 Swift 和 Objective-C 来进行开发。其实一个项目中的 Objective-C 文件和 Swift 文件是处于两个不同世界中的,为了让它们能相互联通,我们需要添加一些桥梁。
当然这个桥梁文件,在新的xcode版本中,是会自动提示是否需要生成,并帮大家自动生成的,所以不需要在意这个问题。
@objc的使用场景一:
显而易见,这就是@objc的一个使用场景之一,如果我们要使用 Objective-C 的代码或者特性来调用纯 Swift 的类型时候,我们会因为找不到所需要的这些运行时信息,而导致失败。
注意:
这个步骤只需要对那些不是继承自 NSObject 的类型进行,如果你用 Swift 写的 class 是继承自 NSObject
的话,Swift 会默认自动为所有的非 private 的类和成员加上 @objc
。这就是说,对一个 NSObject 的子类,你只需要导入相应的头文件就可以在 Objective-C 里使用这个类了。
@objc的使用场景二:
可以通过@objc来进行修改
- @objc(MyClass)
- class Person{
- @objc(greeting:)
- func Hello(name: String) {
- println("Hello,\(name)")
- }
- }
然后我们就可以这样进行Objective-C中的调用了:[[MyClass new] greeting:@"小明"]
最后做一个说明:
说明
添加 @objc 修饰符并不意味着这个方法或者属性会变成动态派发,Swift 依然可能会将其优化为静态调用。如果你需要和 Objective-C 里动态调用时相同的运行时特性的话,你需要使用的修饰符是 dynamic。