内容简介:用最最简单的一句话来介绍这个提案的内容,就是它能让这是什么意思呢?让我们来看目前最常见的泛型函数声明:
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
修饰,编译器可以推导出两件很重要的事情:
- 同一个函数签名,返回值的类型肯定也只能是同一个具体类型
- 外部不能够依赖函数实现里使用的返回值具体类型
这意味着什么?在之前,两个遵循了 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
,但具体的实现有可能随时被调整,所以你不能依赖它。
结语
在这里只是简单地介绍了一些比较核心的内容,想了解更多细节的朋友可以看提案。实际上这个提案只是整个泛型语法改进计划里的第一步,之后等我有了更加深入的了解再做更多分享。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Swift语法快速入门(一)之 Swift基础语法
- 在ES6中使用扩展语法有什么好处?它与rest语法有什么不同?
- Python 基础语法
- go语法
- JPQL 语言语法
- reStructuredText简明语法
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。