29

苹果开发中文网站Swift 5.1 新特性:透明类型关键字 some

 4 years ago
source link: http://www.cocoachina.com/ios/20190612/27048.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Swift 5.1 新特性:透明类型关键字 some

user.png suiling· 2019-06-13
本文来自 没故事的卓同学 ,作者 suiling
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 后,返回值的类型对编译器就变成透明的了。在这个值使用的时候编译器可以根据返回值进行类型推断得到具体类型。

那如果我爱的魔力转圈圈,返回值的类型让编译器猜不到呢?

16b3d4ed57305033?imageslim

我这样写:

image.png

好吧,编译器是个狼人。

image.png



What’s new in Swift 5.1 

SE 0244:opaque result types 

作者:没故事的卓同学
链接:https://juejin.im/post/5cfd434a51882533e13364de


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK