泛型语法改进第一弹 —— 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 ,但具体的实现有可能随时被调整,所以你不能依赖它。

结语

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


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

查看所有标签

猜你喜欢:

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

创新

创新

理查德·福斯特 / 王宇锋 / 中信出版社 / 2008-10 / 32.00元

《创新:进攻者的优势》内容简介:为什么一流企业突然间将它们的市场拱手让与新的竞争者?要避免这样的命运,需要无情地抛弃那些过去使它们成功的技能和产品,那么究竟哪些企业能够做到这一点呢?企业如果总是墨守成规、因循守旧,那么长期下去,必然无法以市场的速度及规模进行革新或创造价值。这样的企业会像得州仪器、施乐等市场领先者一样,被一些资源较少、技术较差、市场支配力较弱的竞争对手超越,而这些所谓进攻者的优势,......一起来看看 《创新》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具