@objc 和 dynamic

Swift 和 Object-C 混编

添加桥接文件, {product-module-name}-Bridging-Header.h 文件, 在这个文件中,添加Swift中需要调用的 OC 类的头文件

@import YYModel

混编的问题,OC 是基于运行时,遵循了 KVC 和动态派发,而 Swift 为了追求性能,在编译时就已经确定,而不需要在运行时的,在 Swift 类型文件中,为了解决这个问题,需要暴露给 OC 使用的任何地方(类,属性,方法等)的生命前面加上 @objc 修饰符

如果用 Swift 写的 class 是继承 NSObject 的话, Swift 会默认自动为所有非 private 的类和成员加上@objc

@objc 修饰符的另一个作用是为 Object-C 侧重新生命方法或者变量的名字。

@objc(MyClass)

class 我的类: NSObject {

func 打招呼(名字: String) {

print("哈喽:\(名字)")

}

}

我的类().打招呼(名字: "小明")

// 上面的 非 ASCII 编码问题

// OC 的话是无法使用中文进行调用的,因此我们必须使用 @objc 将其转换为 ASCII 才能在 OC 中访问

// 在类的上面 加入 @objc(MyClass), 这样 OC 中调用用 [MyClass new] greeting:@"XiaoMing"]

/*

需要注意的是, 添加 @objc 修饰符并不以为这这个方法或者属性会变成动态派发,Swift 依然可能会将其优化为静态调用。如果你需要和 OC 里动态调用相同的运行特性的话,你需要使用的修饰符是 dynamic。 一般情况下做 app 开发时应该用不上,但是在实战一些像动态替换方法或者运行时再决定实现这样的'黑魔法'的时候,我们就需要用到 dynamic 修饰符了。

现在 OC 中的SDK库已经添加了 nonnull 和 nullable 已经泛型的数组和字典,其实都是为了使 SDK 更加适合用 Swift 来使用所做的努力。

*/

你可能感兴趣的:(@objc 和 dynamic)