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

栏目: Swift · 发布时间: 4年前

内容简介:。我开始以为是 SwiftUI 自带的属性,后来经网友提醒发现是 Swift 5.1 的新特性。举个例子:我们有一个函数想要得到一个可以判等的值:
Swift 5.1 新特性:透明类型关键字 some
相信大家都对刚发布的 SwiftUI 印象深刻,在看示例代码的时候发现 View 前面有一个关键字 some

。我开始以为是 SwiftUI 自带的属性,后来经网友提醒发现是 Swift 5.1 的新特性。

some 的用法就是修饰在一个 protocol 前面,默认场景下 protocol 是没有具体类型信息的,但是用 some 修饰后,编译器会让 protocol 的实例类型对外透明。

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

举个例子:我们有一个函数想要得到一个可以判等的值:

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: Equatable>() -> T {
    return 5 as! T
}

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

if intA == intB {
    print("equal")
}
复制代码

在使用泛型约束声明后,在代码调用的时候编译器可以通过类型推断出具体类型是什么,因此就满足了 Equatable 的定义。

但是只能用泛型约束声明语法上确实很操蛋。在某些场景下,开发者的函数返回类型是确定的,可不可以编译器自己推断出具体类型,这样就可以不用泛型约束了呢?

想的是真美啊,苹果这就给你实现了:

Swift 5.1 新特性:透明类型关键字 some
在协议前面标记上 some

后,返回值的类型对编译器就变成透明的了。在这个值使用的时候编译器可以根据反回值进行类型推断得到具体类型。

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

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

我这样写:

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

好吧,编译器是个狼人。

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

What’s new in Swift 5.1 

SE 0244:opaque result types 


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

社交红利

社交红利

徐志斌 / 北京联合出版公司 / 2013-8 / 42

如今的互联网,社交网络已占据了主要的位置。如腾讯微博、微信、QQ空间、人人网、新浪微博、唱吧、美丽说、啪啪等等,都可以算是社交网络,将大部分活跃的人们聚集起来,通过文字、图片、语音等形式分享着身边的事。这些社交网络吸引着更多兴趣相投的陌生人成为朋友结成圈子,也衍生出的海量流量和机会,为业界和创业者提供着源源不绝的新机会。可以这样说,社交网络在将散落在人们中的需求汇聚起来,等待着企业来提供服务。因此......一起来看看 《社交红利》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具