Swift中协议的关联类型
2017-05-11 本文已影响158人
ziyouzhe4
协议的关联类型指的是根据使用场景的变化,如果协议中某些属性存在“逻辑相同的而类型不同”的情况,可以使用关键字associatedtype来为这些属性的类型声明“关联类型”
protocol WeightCalcuAble {
//为weight 属性定义的类型别名
associatedtype WeightType
var weight : WeightType {get}
}
WeightCalculable是一个“可称重”协议,weight属性返回遵守该协议具体类型的实例的重量。这里我们使用associatedtype为该属性的类型定义了一个别名WeightType,换言之在WeightCalculable中并不关心weight的类型是Int 还是Double或者是其他类型,他只是简单的告诉我们返回的类型是WeightType,至于WeightType到底是什么类型由遵守该协议的类中自己去定义。那么这样做的好处是什么呢?
//定义手机结构体
struct MobilePhone : WeightCalcuAble{
typealias WeightType = Double
var weight : WeightType
}
//定义汽车结构体
struct Car : WeightCalcuAble{
typealias WeightType = Int
var weight: WeightType
}
let phone = MobilePhone(weight: 0.24)
let car = Car(weight: 1000)
MobilePhone、Car类型都遵守了WeightCalculable协议,都能被称重,但是手机由于结构精密、体型小巧,小数点后面的数字对于称重来说是必不可少的,所以使用了Double类型,返回0.138千克即138克,但是对于汽车这样的庞然大物在称重时如果还计较小数点后面的数字就显得没有意义了,所以使用Int类型,表示3000千克也就是3吨。
从上面的例子可以很好的看出由于MobilePhone、Car称重时逻辑是一样的,但是对于weight属性的返回值要求不一样,如果仅仅因为返回值类型的不同定义两个类似的协议一个是Int类型另外一个是Double类型,这样做显然是重复的、不合适的。所以associatedtype在这种情况下就发挥出作用了,他让开发者在遵守协议时根据需求去定义返回值的类型,而不是在协议中写死。唯一要注意的是:一定要在遵守该协议的类型中使用typealias规定具体的类型。不然编译器就报错了。