Swift 中 protocol 的默认实现能为我们省去许多重复的代码. 没必要一一实现便能免费得到某些属性或者功能.
但还是有些同学(My stupid little cousin, Just Lee)容易忽略默认实现这个点的细节, 比如下面的例子:
写法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提供的是默认实现, UILabel, UIButton, 可以重新实现 value 属性, 相对来讲提供的接口更灵活.