Swift学习之每日一tip (7) @objc
今天隔壁老王突然问起我,Swift里面的@objc是个神马玩意儿?于是就有了今天的这个tip。 那么话说回来,既然说到@objc,就不得不扯一扯Swift和Objective-C之间不得不说的一些事啦^_^ Objective-C和Swift混合开发Swift 语言的初衷是希望能摆脱 Objective-C 的沉重的历史包袱和约束,但是不可否认的是经过了二十多年的洗礼,Cocoa 框架早就烙上了不可磨灭的 Objective-C 的印记。无数的第三方库是用 Objective-C 写成的,这些积累无论是谁都不能小觑。因此,在最初的版本中,Swift 不得不考虑与 Objective-C 的兼容。 @objc的使用场景一:Objective-C 和 Swift 在底层使用的是两套完全不同的机制,Cocoa 中的 Objective-C 对象是基于运行时的,它从骨子里遵循了 KVC (Key-Value Coding,通过类似字典的方式存储对象信息) 以及动态派发 (Dynamic Dispatch,在运行调用时再决定实际调用的具体实现)。而 Swift 为了追求性能,如果没有特殊需要的话,是不会在运行时再来决定这些的。也就是说,Swift 类型的成员或者方法在编译时就已经决定,而运行时便不再需要经过一次查找,而可以直接使用。 显而易见,这就是@objc的一个使用场景之一, 注意:这个步骤只需要对那些不是继承自 NSObject 的类型进行,如果你用 Swift 写的 class 是 @objc的使用场景二:虽然绝大部分时候自动转换的方法名已经足够好用 (比如会将 Swift 中类似 init(name: String) 的方法转换成 -initWithName:(NSString *)name 这样),但是有时候我们还是期望 Objective-C 里使用和 Swift 中不一样的方法名或者类的名字,比如 Swift 里这样的一个类: class Person{ func Hello(name: String) { println("Hello,(name)") } } Person().Hello("小明") 可以通过@objc来进行修改 @objc(MyClass) class Person{ @objc(greeting:) func Hello(name: String) { println("Hello,(name)") } } 然后我们就可以这样进行Objective-C中的调用了: 最后做一个说明: 说明添加 @objc 修饰符并不意味着这个方法或者属性会变成动态派发,Swift 依然可能会将其优化为静态调用。如果你需要和 Objective-C 里动态调用时相同的运行时特性的话,你需要使用的修饰符是 dynamic。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |