返回

ObjC 里的@objc, @objcMembers 与Swift中的Dynamic

IOS

在 Objective-C 中,对象是基于运行时的,方法或属性使用动态派发,在运行调用时再决定实际调用的具体实现。而 Swift 为了追求性能,如果没有特殊需要的话,是不会在运行时再来决定这些的。也就是说,Swift 类型的成员或者方法在编译时就已经决定,而运行时便不再需要经过一次查找和判断。

共同点

  • @objc@objcMembersDynamic 都是用来在 Swift 中使用 Objective-C 的特性,可以用来编写一个 Objective-C 框架,以供 Swift 使用。
  • Objective-C 对象是基于运行时的,方法或属性使用动态派发,在运行调用时再决定实际调用的具体实现。
  • Swift 为了追求性能,如果没有特殊需要的话,是不会在运行时再来决定这些的。也就是说,Swift 类型的成员或者方法在编译时就已经决定,而运行时便不再需要经过一次查找和判断。

不同点

  • @objc 是用来将一个 Swift 类标记为 Objective-C 可见,这样就可以在 Objective-C 代码中使用它。
  • @objcMembers 是用来将一个 Swift 类的所有成员标记为 Objective-C 可见。
  • Dynamic 是用来将一个 Swift 类的某个成员标记为动态,这样就可以在 Objective-C 代码中使用它。

使用场景

  • 当你想要在 Objective-C 代码中使用一个 Swift 类时,可以使用 @objc@objcMembers
  • 当你想要在 Objective-C 代码中使用一个 Swift 类的某个成员时,可以使用 Dynamic

注意事项

  • @objc@objcMembersDynamic 只能用于类和结构体,不能用于枚举和协议。
  • 当你使用 @objc@objcMembers 时,需要确保你的 Swift 代码与 Objective-C 代码兼容。
  • 当你使用 Dynamic 时,需要确保你的 Swift 代码与 Objective-C 代码兼容。
  • 对于无需调用 OC 的成员或者方法,不建议加 Dynamic,否则会降低 Swift 的性能。

总结

@objc@objcMembersDynamic 都是用来在 Swift 中使用 Objective-C 的特性,它们的区别在于:

  • @objc 是用来将一个 Swift 类标记为 Objective-C 可见,这样就可以在 Objective-C 代码中使用它。
  • @objcMembers 是用来将一个 Swift 类的所有成员标记为 Objective-C 可见。
  • Dynamic 是用来将一个 Swift 类的某个成员标记为动态,这样就可以在 Objective-C 代码中使用它。