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

沒故事的卓同學 2019-06-13 09:55:26 5065
image.png

相信大家都對剛發布的 SwiftUI 印象深刻,在看示例代碼的時候發現 View 前面有一個關鍵字  some。我開始以為是 SwiftUI 自帶的屬性,后來經網友提醒發現是 Swift 5.1 的新特性。

some 的用法就是修飾在一個 protocol 前面,默認場景下 protocol 是沒有具體類型信息的,但是用 some 修飾后,編譯器會讓 protocol 的實例類型對外透明。

image.png

舉個例子:我們有一個函數想要得到一個可以判等的值:

func makeInt() -> Equatable {
    return 5
}

let intA = makeInt()
let intB = makeInt()

if intA == intB {
    print("equal")
}

但是這樣寫編譯器會報錯:

Protocol 'Equatable' can only be used as a generic constraint because it has Self or associated type requirements

Equatable 的協議中的定義和具體類型有關,上面的例子中編譯器不知道 makeInt() 返回的具體類型是哪一個,因此它不能作為一個函數值返回的類型。不能當做一個類型使用,只能用作泛型約束。

如果在原有體系下就只能這樣做:

func makeInt() -> T {
    return 5 as! T
}

let intA: Int = makeInt()
let intB: Int = makeInt()

if intA == intB {
    print("equal")
}

在使用泛型約束聲明后,在代碼調用的時候編譯器可以通過類型推斷出具體類型是什么,因此就滿足了 Equatable 的定義。

但是只能用泛型約束聲明語法上確實很操蛋。在某些場景下,開發者的函數返回類型是確定的,可不可以編譯器自己推斷出具體類型,這樣就可以不用泛型約束了呢?

想的是真美啊,蘋果這就給你實現了:

image.png

在協議前面標記上 some 后,返回值的類型對編譯器就變成透明的了。在這個值使用的時候編譯器可以根據返回值進行類型推斷得到具體類型。

那如果我愛的魔力轉圈圈,返回值的類型讓編譯器猜不到呢?


我這樣寫:

image.png

好吧,編譯器是個狼人。

image.png


What’s new in Swift 5.1 

SE 0244:opaque result types 

作者:沒故事的卓同學
鏈接:https://juejin.im/post/5cfd434a51882533e13364de

广东26选5开奖结果查