内容简介:Objective-C 中的 Protocol 里存在 @optional 关键字,被这个关键字修饰的方法并非必须要被实现。比如最常见的 UITableViewDataSource 和 UITableViewDelegate。但是在 Swift 中的 Protocol 的所有方法都是必须被实现的。那么我们怎么样才能在 Swift 实现可选接口呢?原生的 Swift Protocol 里是没有可选项的,所有定义的方法都是必须被实现的。如果我们需要像 Objective-C 里那样定义可选的方法,可以直接将接口
Objective-C 中的 Protocol 里存在 @optional 关键字,被这个关键字修饰的方法并非必须要被实现。比如最常见的 UITableViewDataSource 和 UITableViewDelegate。但是在 Swift 中的 Protocol 的所有方法都是必须被实现的。那么我们怎么样才能在 Swift 实现可选接口呢?
- @objc & optional
- 接口扩展
@objc & optional
@objc protocol MyProtocol { func doSomething() @objc optional func doSomething_optional() } class MyClass: NSObject, MyProtocol { func doSomething() { } } /// 编译不通过 /// Non-class type 'MyStruct' cannot conform to class protocol 'MyProtocol' struct MyStruct: MyProtocol { } 复制代码
原生的 Swift Protocol 里是没有可选项的,所有定义的方法都是必须被实现的。如果我们需要像 Objective-C 里那样定义可选的方法,可以直接将接口本身定义为 Objective-C 的。
优势
- 直接以 Objective-C 的接口使用方式来使用。
劣势
- 使用 @objc 修饰的 Protocol 就只能被 class 实现。对于 struct 和 enum 类型,我们无法实现此种方式定义的接口。
接口扩展
extension MyProtocol { func doSomething_optional() { print("Default implementing by extension protocol.") } } class MyClass: MyProtocol { func doSomething() { // do something } } struct MyStruct: MyProtocol { func doSomething() { // do something } } enum MyEnum: MyProtocol { func doSomething() { // do something } } 复制代码
虽然 Swift 中定义的 Protocol 的方法都是必须实现的,但是我们可以利用 protocol extension 的方式给出部分方法的默认实现。
优势
- 利用 extension 给出默认实现的接口可以供 class、struct 及 enum 使用。
劣势
- 对于有返回值的接口,默认实现总是需要提供一个合适的返回值,但是并不总是有合适的默认值返回。
例如:
protocol MyProtocol { func calculateRadian() -> Double } 复制代码
这里的 Protocol 定义的方法返回一个计算出来的弧度,但是这时我们就很难找到一个合适的默认值去默认实现接口的方法。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 接口测试及常用接口测试工具
- Java中的Comparable接口和Comparator接口
- Java 的 Closeable 接口和 Cloneable 接口
- python接口自动化测试之接口数据依赖
- Kotlin 接口与 Java8 新特性接口
- Java接口全链路优化:如何降低接口RT时长
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。