专栏首页iOS开发干货分享Swift 5.1 新特性:透明类型关键字 some

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

相信大家都对刚发布的 SwiftUI 印象深刻,在看示例代码的时候发现 View 前面有一个关键字 some。我开始以为是 SwiftUI 自带的属性,后来经网友提醒发现是 Swift 5.1 的新特性。

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

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

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 的定义。

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

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

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

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

我这样写:

好吧,编译器是个狼人。

本文分享自微信公众号 - iOSSir(iOSSir),作者:没故事的卓同学

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • iOS你不知道的事--Crash分析

    原文地址:https://www.jianshu.com/p/56f96167a6e9

    iOSSir
  • 你真的能写好一个单例么?

    单例可能是 iOS 开发者最熟悉设计模式之一了。 我们的项目里头也使用了很多单例?。 最近为了解决项目中单例的 bug 而花费了两天多的时间,发现用 ObjC ...

    iOSSir
  • Flutter 与 iOS 原生 WebView 对比

    原文作者:享物说 https://juejin.im/post/5c778d86e51d4506304ee348

    iOSSir
  • 陈天奇:深度学习编译技术的现状和未来

    深度学习编译器的部署目标传统的深度学习框架也可以做,一个非常自然的问题是为什么不直接沿用传统的框架。这是一个编译器研究者来往往会忽略的问题。深度学习编译器只有在...

    机器之心
  • 高级编译器设计与实现(Steven.S.Muchnick).(中文版)

    本书是经典的编译器著作,与“龙书”齐名。书中针对现代语言和体系结构全面介绍了编译器设计与实现的高级论题,从编译器的基础领域中的高级问题开始,然后深入讨论了各种重...

    用户3157710
  • 程序员大神教你学C语言/C加加编程零基础新手入门

    第一章:编译器和程序 很多小伙伴都老是会碰到疑问,其实还是基础没打扎实,这些题如果你不看答案你能知道多少呢?如果还有很多不知道就证明基础没打扎实,如果你还在入门...

    企鹅号小编
  • 编译器的结构|编译原理

    今天的内容是冠以编译器的结构。(翻译内容可能不太准确,谅解,凑合看吧)

    仇诺伊
  • eclipse中安装spring Tool自动补全插件,命名空间

    打开eclipse编译器,然后选择help ->elipse Marketplace

    沁溪源
  • 微软发布新的Visual C++代码优化器

    微软在5月4日发布了新的高级代码优化器,服务于Visual C++的后端编译器。提高了代码性能,可以压缩代码体积,将编译器带入了一个新的境界。 Visual C...

    CSDN技术头条
  • 基础知识 | 每日一练(105)

    士人有百折不回之真心,才有万变不穷之妙用。立业建功,事事要从实地着脚,若少慕声闻,便成伪果;讲道修德,念念要从虚处立基,若稍计功效,便落尘情。 ...

    闫小林

扫码关注云+社区

领取腾讯云代金券