typealias
1枕扫、可以用來對已有的類型進行重命名指郁,比如在表示兩點之間的距離的時候,可以使用typealias將x和y軸的距離Double表示為Distance。
func distance(p1: CGPoint, p2: CGPoint) -> Double {
let x = Double(p1.x - p2.x)
let y = Double(p1.y - p2.y)
return sqrt(x * x + y * y)
}
typealias Distance = Double
func distance2(p1: CGPoint, p2: CGPoint) -> Double {
let x = Distance(p1.x - p2.x)
let y = Distance(p1.y - p2.y)
return sqrt(x * x + y * y)
}
通過上面的表述蝌箍,可以使語義更加清晰,特別是在做一些數(shù)據(jù)計算的時候暂吉,不會出現(xiàn)很多Int陆蟆,Double的數(shù)字處理,可以使用更加語義明確的表達需要計算的數(shù)據(jù)凤藏。
2奸忽、可以對閉包進行重新命名堕伪,這樣在做參數(shù)傳遞的時候更加清晰
typealias Success = (_ result: String) -> Void
typealias Failure = (_ error: String) -> Void
public func excuteNetworking(_ successBlock: Success, failBlock: Failure) {
}
3、協(xié)議使用associatedtype的時候栗菜,可以用來對關聯(lián)類型重定義欠雌,協(xié)助協(xié)議實現(xiàn)泛型功能,下面會說到
associatedtype
1疙筹、關聯(lián)類型作為協(xié)議實現(xiàn)泛型的一種方式富俄,可以在協(xié)議中預先定義一個占位符,實現(xiàn)協(xié)議的時候再確定這個占位符具體的類型腌歉。
下面是一個通用的協(xié)議蛙酪,以及實現(xiàn)協(xié)議的類
protocol Food {
func desc() -> String
}
class Apple: Food {
func desc() -> String {
return "apple"
}
}
protocol Animal {
func eat(food: Food)
}
class People: Animal {
func eat(food: Food) {
print("eat \(food.desc())")
}
}
let p = People()
p.eat(food: Apple())
上面的例子中,人繼承自動物翘盖,實現(xiàn)eat方法桂塞,方法中的Food是代表食物,也是一個協(xié)議馍驯,現(xiàn)在是假設人可以吃所有的食物阁危。
再看下面的例子,如果把動物吃的食物換成associatedType類型(下面的代碼編譯不過)
protocol Animal2 {
associatedtype F: Food
func eat(food: F)
}
class People2: Animal2 {
typealias F = Food
func eat(food: F) {
print("eat \(food.desc())")
}
}
編譯器會報錯汰瘫,大致意思是人沒有實現(xiàn)動物中的關聯(lián)類型狂打,關聯(lián)類型需要是一個確定的類型,而不是一個協(xié)議混弥,我們將上面的People2改成如下形式趴乡,讓F是一個具體的類型,比如Apple蝗拿,就可以了
protocol Animal2 {
associatedtype F: Food
func eat(food: F)
}
class People2: Animal2 {
typealias F = Apple
func eat(food: F) {
print("eat \(food.desc())")
}
}
let p = People2()
p.eat(food: Apple())
對于上面的寫法晾捏,雖然用這個例子不太好解釋,上面是限定了人吃東西只能吃蘋果哀托,這樣顯然是不合適的惦辛,但是如果是熊貓或者是病人,我們就可以限定他吃的東西只能是某種具體的食物仓手。
在實際應用中胖齐,如果協(xié)議使用了關聯(lián)類型,那么這個協(xié)議就失去了動態(tài)派發(fā)的特性嗽冒,比如上面的例子人就只能吃蘋果了呀伙。如果你給他吃一個梨,那他就消化不了
class Orange: Food {
func desc() -> String {
return "orange"
}
}
let p = People2()
p.eat(food: Orange())
當然添坊,我們也可以將People定義為泛型区匠,這樣在確認人的類型的時候需要確定他只能吃什么
class People2<F: Food>: Animal2 {
typealias MF = F
func eat(food: MF) {
print("eat \(food.desc())")
}
}
let p: People2<Apple> = People2()
p.eat(food: Apple())
1、Swift - 關鍵字(typealias、associatedtype)
2驰弄、Swift3-associatedtype用法
3麻汰、swift的protocol帶有associatedtype