some
。我開始覺得是 SwiftUI 自帶的屬性,後來經網友提醒發現是 Swift 5.1 的新特性。
some
的用法就是修飾在一個 protocol 前面,默認場景下 protocol 是沒有具體類型信息的,可是用 some
修飾後,編譯器會讓 protocol 的實例類型對外透明。 git
func makeInt() -> Equatable {
return 5
}
let intA = makeInt()
let intB = makeInt()
if intA == intB {
print("equal")
}
複製代碼
可是這樣寫編譯器會報錯:github
Protocol 'Equatable' can only be used as a generic constraint because it has Self or associated type requirementsswift
Equatable
的協議中的定義和具體類型有關,上面的例子中編譯器不知道 makeInt()
返回的具體類型是哪個,所以它不能做爲一個函數值返回的類型。不能當作一個類型使用,只能用做泛型約束。app
若是在原有體系下就只能這樣作:函數
func makeInt<T: Equatable>() -> T {
return 5 as! T
}
let intA: Int = makeInt()
let intB: Int = makeInt()
if intA == intB {
print("equal")
}
複製代碼
在使用泛型約束聲明後,在代碼調用的時候編譯器能夠經過類型推斷出具體類型是什麼,所以就知足了 Equatable
的定義。ui
可是隻能用泛型約束聲明語法上確實很操蛋。在某些場景下,開發者的函數返回類型是肯定的,可不能夠編譯器本身推斷出具體類型,這樣就能夠不用泛型約束了呢?spa
想的是真美啊,蘋果這就給你實現了: 3d
some
後,返回值的類型對編譯器就變成透明的了。在這個值使用的時候編譯器能夠根據返回值進行類型推斷獲得具體類型。
那若是我愛的魔力轉圈圈,返回值的類型讓編譯器猜不到呢? code
好吧,編譯器是個狼人。 cdn