除了帶有協議擴展的語法外:protocol P {}extension P where Self : UIView {}...我偶然發現您可以在協議本身上使用相同的where子句:protocol P where Self : UIView {}請注意,這是不一樣的where子句限制一個通用的協議,并沒有自己做P上的通用協議。我的實驗似乎表明,此處只能使用冒號,并且冒號后面的內容必須是類或協議(可能是通用的)。我很好奇:這是怎么逃避我的注意的?所以我去尋找它何時出現的證據。在Swift 3.0中,前一種語法是合法的,但后者則不合法。在Swift 3.3中,兩者均合法。因此,后一種語法必須已在Swift 3.2之類的工具中悄然引入。我之所以說“安靜”,是因為在發行說明中找不到任何有關它的信息。第二種語法是什么?看起來是不是一種確保其他類型都不能采用此協議的便捷方法?Swift標頭似乎沒有使用它。
3 回答
慕森王
TA貢獻1777條經驗 獲得超3個贊
在Swift 5中,您將編寫protocol P where Self : C, Self : Decodable {}or protocol P where Self : C & Decodable {}或protocol P : C, Decodable {}。然而,在Swift 4.x中,正如我的答案所討論的,編譯器不支持這種構造。
慕容3067478
TA貢獻1773條經驗 獲得超3個贊
IMO的改變是有道理的-協議派生(即protocol P2 : P1)在語義上應等效于對的約束Self,即protocol P2 where Self : P1。因此,如果您允許protocol P2 where Self : SomeClass,也允許它似乎是合乎邏輯的protocol P2 : SomeClass(盡管如此,我很欣賞如何將其容易地誤認為繼承)。
添加回答
舉報
0/150
提交
取消
