swift associatedtype和typealias

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())")
    }
}
使用assotiatedtype的協(xié)議

編譯器會報錯汰瘫,大致意思是人沒有實現(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

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市戚篙,隨后出現(xiàn)的幾起案子五鲫,更是在濱河造成了極大的恐慌,老刑警劉巖岔擂,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件位喂,死亡現(xiàn)場離奇詭異,居然都是意外死亡乱灵,警方通過查閱死者的電腦和手機塑崖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來痛倚,“玉大人规婆,你說我怎么就攤上這事〔跷龋” “怎么了抒蚜?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長耘戚。 經(jīng)常有香客問我嗡髓,道長,這世上最難降的妖魔是什么收津? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任饿这,我火速辦了婚禮,結(jié)果婚禮上撞秋,老公的妹妹穿的比我還像新娘长捧。我一直安慰自己,他們只是感情好部服,可當我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布唆姐。 她就那樣靜靜地躺著拗慨,像睡著了一般廓八。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赵抢,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天剧蹂,我揣著相機與錄音,去河邊找鬼烦却。 笑死宠叼,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播冒冬,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼伸蚯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了简烤?” 一聲冷哼從身側(cè)響起剂邮,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎横侦,沒想到半個月后挥萌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡枉侧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年引瀑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片榨馁。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡憨栽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辆影,到底是詐尸還是另有隱情徒像,我是刑警寧澤,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布蛙讥,位于F島的核電站锯蛀,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏次慢。R本人自食惡果不足惜旁涤,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望迫像。 院中可真熱鬧劈愚,春花似錦、人聲如沸闻妓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽由缆。三九已至注祖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間均唉,已是汗流浹背是晨。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留舔箭,地道東北人罩缴。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親箫章。 傳聞我的和親對象是個殘疾皇子烙荷,可洞房花燭夜當晚...
    茶點故事閱讀 43,492評論 2 348