内容概览
- Swift 与 Objective-C 交互
- 错误处理
- 为空性标注
- 轻量级泛型
-
Kindof
类型 - 总结
Swift 与 Objective-C 交互
Swift方法什么时候暴露给Objective-C?
NSObject基类
- 方法的访问控制不是
private
级别
class MyController : UIViewController {
private func refresh() {
// ...
}
}
- 没有使用Swift特性
class MyController : UIViewController {
func refresh() -> (Int, String)? {
// ...
return (status, response)
}
}
非NSObject基类
- 在遵守 NSObjectProtocol 协议时,标注 @objc
class MyController : UIWebViewDelegate {
func webViewDidStartLoad(v: UIWebView) {
// ...
}
}
不过,这种情况发生时,Xcode会给出警告。
显式地标记
- 标记 @IBOutlet, @IBAction, @NSManaged等属性, 以支持 Interface Builder、Core Data
class MyController : UIViewController {
@IBAction private func refresh() {
// ...
}
}
- 标记
dynamic
修饰符,以支持Objective-C的Runtime,表示当前值可能在运行时被KVO更新
class MyController : UIViewController {
dynamic private var title: String? {
get { /* ... */ }
set { /* ... */ }
}
}
- 标记
@objc
修饰符,直接暴露给Objective-C
class MyController : UIViewController {
@objc private func refresh() {
// ...
}
}
标记 @objc
后,将无法使用Swift特性
Selector 冲突
Objective-C根据方法的名称区分方法,而不是方法的签名。
所以,在Swift中定义的同名方法如果需要暴露给Objective-C时,有可能会遭遇错误提示。
对于这个问题,有两种解决方案:
- 使用
@objc
属性对暴露给Objective-C的方法进行重命名
- 使用
@nonobjc
属性,禁止将方法暴露给Objective-C