Swift 5.1 新特性:透明類型關鍵字 some

相信你們都對剛發佈的 SwiftUI 印象深入,在看示例代碼的時候發現 View 前面有一個關鍵字 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


What’s new in Swift 5.1 

SE 0244:opaque result types 

相關文章
相關標籤/搜索