神刀安全网

每周 Swift 社区问答:@objc

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

用法

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

  • 未嵌套的类
  • 协议
  • 非泛型枚举(仅限于原始值为整形的类型)
  • 类和协议中的属性和方法
  • 构造器和析构器
  • 下标

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

@objc class MyHelper:NSObject {
// class code
}

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

@objc class MyViewController : UIViewController {

}

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

@objc(MyClass)
class 我的类: NSObject {
@objc(greeting:)
func 打招呼(名字: String) {
print("哈喽,/(名字)")
}
}

协议

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

@objc protocol CounterDataSource {
optional func incrementForCount(count: Int) -> Int
optional var fixedIncrement: Int { get }
}

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

枚举

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

关于如何在 Objective-C 中使用 Swift 枚举类型,可以见这个 帖子 :

// Swift
@objc enum Bear: Int {
case Black, Grizzly, Polar
}

// OC
Bear type = BearBlack;
switch (type) {
case BearBlack:
case BearGrizzly:
case BearPolar:
[self runLikeHell];
}

其他

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

@objc class ExampleClass: NSObject {
var enabled: Bool {
@objc(isEnabled) get {
// Return the appropriate value
}
}
}

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

stackoverflow 相关问题整理

参考资料

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » 每周 Swift 社区问答:@objc

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址