Objective-C 中的 Protocol 里存在 @optional 关键字,被这个关键字修饰的方法并不是必需要被实现。好比最多见的 UITableViewDataSource 和 UITableViewDelegate。可是在 Swift 中的 Protocol 的全部方法都是必须被实现的。那么咱们怎么样才能在 Swift 实现可选接口呢?swift
@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 的。bash
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 的方式给出部分方法的默认实现。ui
例如:spa
protocol MyProtocol {
func calculateRadian() -> Double
}
复制代码
这里的 Protocol 定义的方法返回一个计算出来的弧度,可是这时咱们就很难找到一个合适的默认值去默认实现接口的方法。code