protocol MyProtocol {
func doSomething()
}
extension MyProtocol {
func doSomething() {
/* return a default value or just leave empty */
}
}
struct MyStruct: MyProtocol {
/* no compile error */
}
复制代码
protocol SomeParserDelegate {
func validate(value: Any) -> Bool
}
复制代码
若是你提供了一个返回值为true的默认实现,乍一看这么作没有问题。接下来考虑一下下面的伪代码:swift
final class SomeParser {
func parse(data: Data) -> [Any] {
if /* delegate.validate(value:) is not implemented */ {
/* parse very fast without validating */
} else {
/* parse and validate every value */
}
}
}
复制代码
这时是没法实现优化这个分支(if)的,由于你没法知道你的delegate是否实现了这个方法。 虽然有不少方法能够解决这个问题(使用optional closures,不一样的delegate对象用于不一样的操做等等),这个例子只是清晰地说明这么作存在的问题。bash
@objc optional
@objc protocol MyProtocol {
@objc optional func doSomething()
}
class MyClass: NSObject, MyProtocol {
/* no compile error */
}
复制代码
@objc optional
关键字修饰就能够了。