泛型语法改进第一弹 —— Opaque Result Types

栏目: IOS · 发布时间: 6年前

内容简介:用最最简单的一句话来介绍这个提案的内容,就是它能让这是什么意思呢?让我们来看目前最常见的泛型函数声明:

SE-0244 Opaque Result Types 提案前一段时间通过了 review 并且在 Swift 5.1 里完成了实现,我最早阅读这份提案的时候理解不是很透彻,今天比较仔细地读了这篇 Improving the UI of generics 之后有了更多的认识,而且发现自己之前发的 tweet 里有一些错误的认知,所以这里写篇文章,希望用 最直白的方式解释清楚提案的内容 ,跟大家分享一下我自己的理解。

Opaque Result Types?

用最最简单的一句话来介绍这个提案的内容,就是它能让 被调用者 选择泛型返回值的具体类型。

这是什么意思呢?让我们来看目前最常见的泛型函数声明:

protocol Shape { ... }

func generic<T: Shape>() -> T { ... }

let x: Rectangle = generic() // type(of: x) == Rectangle, 调用方决定返回值类型

这很好,但有时候我们不希望暴露出具体的返回类型,也不想让 调用者 去依赖具体的类型,之前我们可以直接使用泛型类型:

func generic() -> Shape { ... }

let x = generic() // type(of: x) == Shape

虽然这样确实能达成我们的目的,但也会带来一些副作用,例如说 性能问题 ,因为实际上 generic 返回的是一个实例的容器。

我们更希望的是能够像第一种声明那样, 在编译时就确定返回值的具体类型 ,并且由 被调用方 去决定:

func reverseGeneric() -> some Shape { return Rectangle(...)  }

let x = reverseGeneric() 
// type(of: x) == Rectangle
// 并且 x 的类型根据 reverseGeneric 的具体实现决定

通过引入 some 这个关键字去修饰返回值,就可以让 被调用方 选择具体的返回值类型,并且是在编译时确定下来的,这意味着我们不需要额外的容器去存放返回的实际值。

另外它还可以作为属性使用:

func someNumber() -> some Numeric { ... }

var number: some Numeric = someNumber()

它可以?

在这里我们需要先确立一个条件, 通过 some 修饰的类型,都会在编译时确定下来,可以简单地理解为被调用方负责传入的一个泛型参数 ,相关的功能和限制都是基于这个特性延伸出来的。

根据前面的条件,如果返回值使用了 some 修饰,编译器可以推导出两件很重要的事情:

  1. 同一个函数签名,返回值的类型肯定也只能是同一个具体类型
  2. 外部不能够依赖函数实现里使用的返回值具体类型

这意味着什么?在之前,两个遵循了 Equatable 的实例不能判断是否相等,因为我们并不知道它们具体的类型是否一样,但如果使用了 some ,并且是由同一个函数返回的,那就完全不是问题了:

func randomNumber() -> some Equatable {
    let i: Int = 32
    return i
}

let x = randomNumber()
let y = randomNumber()

// 在这里使用 == 是没问题的
// 因为 x 跟 y 都是由 randomNumber 返回的
// 所以它们的具体类型必然一致
print(x == y)

但是控制返回值类型的是调用方,所以你不能够依赖调用方的具体实现:

func randomNumber() -> some Equatable {
    let i: Int = 32
    return i
}

var otherNumber: Int = 38
var x = randomNumber()
x = otherNumber // error

虽然你知道 randomEquatableNumber 的实现里使用的是 Int ,但具体的实现有可能随时被调整,所以你不能依赖它。

结语

在这里只是简单地介绍了一些比较核心的内容,想了解更多细节的朋友可以看提案。实际上这个提案只是整个泛型语法改进计划里的第一步,之后等我有了更加深入的了解再做更多分享。


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

查看所有标签

猜你喜欢:

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

世界是数字的

世界是数字的

[美] Brian W. Kernighan / 李松峰、徐建刚 / 人民邮电出版社 / 2013-6 / 49.00

家用电器、汽车、飞机、相机、手机、GPS 导航仪,还有游戏机,虽然你看不见,但这些设备都有计算能力。手机通信网络、有线电视网络、空中交通管制系统、电力系统、银行和金融服务系统等基础设施背后无一不是计算机在支撑。如今的世界是数字的,而计算机和计算无处不在。这本书就是要告诉大家数字世界有关计算机的一切。本书没有高深莫测的专业术语,但它全面解释了当今计算和通信领域的工作方式,包括硬件、软件、互联网、通信......一起来看看 《世界是数字的》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

在线进制转换器
在线进制转换器

各进制数互转换器