每周 Swift 社区问答:@objc

前端之家收集整理的这篇文章主要介绍了每周 Swift 社区问答:@objc前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Swift 和 Objective-C 的互调这个话题很大,今天我们重点看看其中一个小的知识点:@objc的使用。

用法

在 Swift 代码中,使用@objc修饰后的类型,可以直接供 Objective-C 调用。可以使用@objc修饰的类型包括

  • 未嵌套的类

  • 协议

  • 非泛型枚举(仅限于原始值为整形的类型)

  • 类和协议中的属性方法

  • 构造器和析构器

  • 下标

我们逐个来看看实际的使用:

  1. @objc class MyHelper:NSObject {
  2. // class code
  3. }

Objective-C 中所有的类都需要继承自NSObject,Swift 中的类需要供 Objective-C 调用的时候,自然也需要显式继承自NSObject 。当然,你也可以继承所有 Objective-C 中的类,因为他们本身也继承自NSObject:

  1. @objc class MyViewController : UIViewController {
  2. }

另外一个细节是,Swift 中的类名,可以使用中文命名,而 Objective-C 中的却只能使用 ASCII 码,在使用@objc时,需要指定 Objective-C 中使用的 ASCII 名称。这个知识点请参见喵神的 tips

  1. @objc(MyClass)
  2. class 我的类: NSObject {
  3. @objc(greeting:)
  4. func 打招呼(名字: String) {
  5. print("哈喽,\(名字)")
  6. }
  7. }

协议

@objc修饰协议与修饰类一样,需要注意的是,如果协议中有optional修饰的方法,就必须使用@objc来修饰:

  1. @objc protocol CounterDataSource {
  2. optional func incrementForCount(count: Int) -> Int
  3. optional var fixedIncrement: Int { get }
  4. }

关于可选协议的描述,可以参见官方教程

枚举

Swift 中的枚举类型,功能增强了不少。Objective-C 中还是传统的枚举类型,必须使用整型作为原始值。这样看来,Swift 中的枚举类型如果要被@objc修饰,则需要满足原始值是整型的限制条件。不然就会报编译错误
关于如何在 Objective-C 中使用 Swift 枚举类型,可以见这个帖子:

  1. // Swift
  2. @objc enum Bear: Int {
  3. case Black,Grizzly,Polar
  4. }
  5.  
  6. // OC
  7. Bear type = BearBlack;
  8. switch (type) {
  9. case BearBlack:
  10. case BearGrizzly:
  11. case BearPolar:
  12. [self runLikeHell];
  13. }

其他

在类和协议中的属性方法,构造器和析构器,下标中使用@objc修饰的用法与上面的用法一样。这里举一个官网的例子说明:

  1. @objc class ExampleClass: NSObject {
  2. var enabled: Bool {
  3. @objc(isEnabled) get {
  4. // Return the appropriate value
  5. }
  6. }
  7. }

需要注意的是,如果类中方法或者属性@objc修饰,那么类就必须被@objc修饰。

stackoverflow 相关问题整理

参考资料

猜你在找的Swift相关文章