Swift protocol的默认实现

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 属性, 相对来讲提供的接口更灵活.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容