1、为何要加前缀呢?
extension String{
func test() {
print("测试")
}
}
"测试".test()
上面这行简答的代码意思就是给系统String扩充一个test方法而已。考虑到类似得这样的扩充,为了避免与系统的方法重复,最好就是加一个前缀xxx, 像这样”测试”.xxx.test()调用
2、初步设计
struct HT {
func test() {
print("测试")
}
}
extension String{
var ht:HT {
return HT()
}
}
extension UIView{
var ht:HT {
return HT()
}
}
class Student{}
extension Student{
var ht:HT {
return HT()
}
}
"测试".ht.test()
UIView().ht.test()
Student().ht.test()
上面的代码已经可以实现我们想要的结果,但是很明显有重复的代码
3、使用协议
struct HT {
func test() {
print("测试")
}
}
protocol HTCompatible{}
extension HTCompatible{
var ht:HT {
return HT()
}
}
extension String:HTCompatible{}
extension UIView:HTCompatible{}
"测试".ht.test()
UIView().ht.test()
这样我们通过HTCompatible就可以巧妙地抽取了重复的代码,看起来十分简单优雅。
4、使用泛型
struct HT<Base> {
var base:Base
init(_ base:Base) {
self.base = base
}
}
protocol HTCompatible{}
extension HTCompatible{
var ht:HT<Self> {
return HT(self)
}
}
extension String:HTCompatible{}
extension UIView:HTCompatible{}
extension HT where Base == String {
func test() {
}
}
extension HT where Base:UIView{
func test1() {
}
}
UIView().ht.test1()
"测试".ht.test()
网友评论