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
關鍵字修飾就能夠了。