Swift 中 protocol 的默認(rèn)實(shí)現(xiàn)能為我們省去許多重復(fù)的代碼. 沒必要一一實(shí)現(xiàn)便能免費(fèi)得到某些屬性或者功能.
但還是有些同學(xué)(My stupid little cousin, Just Lee)容易忽略默認(rèn)實(shí)現(xiàn)這個(gè)點(diǎn)的細(xì)節(jié), 比如下面的例子:
寫法1:
protocol UITextDisplay {
var value: String { get }
}
extension UITextDisplay where Self: UILabel {
var value: String {
return text ?? ""
}
}
extension UITextDisplay where Self: UIButton {
var value: String {
return title(for: .normal) ?? title(for: .selected) ?? ""
}
}
extension UITextDisplay where Self: UITextField {
var value: String {
return text ?? ""
}
}
extension UITextDisplay where Self: UITextView {
var value: String {
return text ?? ""
}
}
extension UILabel: UITextDisplay {
}
extension UIButton: UITextDisplay {
}
extension UITextField: UITextDisplay {
}
extension UITextView: UITextDisplay {
}
寫法2:
protocol UITextDisplay {
var value: String { get }
}
extension UILabel: UITextDisplay {
var value: String {
return text ?? ""
}
}
extension UIButton: UITextDisplay {
var value: String {
return title(for: .normal) ?? title(for: .selected) ?? ""
}
}
extension UITextField: UITextDisplay {
var value: String {
return text ?? ""
}
}
extension UITextView: UITextDisplay {
var value: String {
return text ?? ""
}
}
看起來寫法2更簡單, 代碼量更少, 但是寫法1提供的是默認(rèn)實(shí)現(xiàn), UILabel, UIButton, 可以重新實(shí)現(xiàn) value 屬性, 相對來講提供的接口更靈活.