(WWDC) Swift 和 Objective-C 的互操作性

本文详细探讨了Swift与Objective-C的交互,包括Swift方法如何暴露给Objective-C,错误处理的差异,为空性标注的处理,轻量级泛型的使用,以及KindOf类型在API设计中的应用。同时,文章指出Swift的更新使得Objective-C的API在Swift中更加易用和安全。
摘要由CSDN通过智能技术生成



1306450-a02a26b3521e8b15.png
Xcode根据Objective-C代码自动生成的Swift代码


内容概览

  • 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会给出警告。

1306450-2b9d7cc67dcf1467.png


显式地标记
  • 标记 @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特性

1306450-23dce0c280c77750.png



Selector 冲突



Objective-C根据方法的名称区分方法,而不是方法的签名。
所以,在Swift中定义的同名方法如果需要暴露给Objective-C时,有可能会遭遇错误提示。

1306450-2a401a6eb9fb9941.png



对于这个问题,有两种解决方案:

  • 使用@objc属性对暴露给Objective-C的方法进行重命名
1306450-11575a389141230c.png
  • 使用@nonobjc属性,禁止将方法暴露给Objective-C
    1306450-e906cabc4a5e936a.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值