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

2019-06-2720:31:36编程语言入门到精通Comments2,551 views字数 987阅读模式
Swift 5.1 新特性:透明类型关键字 some

相信大家都对刚发布的 SwiftUI 印象深刻,在看示例代码的时候发现 View 前面有一个关键字 some。我开始以为是 SwiftUI 自带的属性,后来经网友提醒发现是 Swift 5.1 的新特性。some 的用法就是修饰在一个 protocol 前面,默认场景下 protocol 是没有具体类型信息的,但是用 some 修饰后,编译器会让 protocol 的实例类型对外透明。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/13823.html

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

举个例子:我们有一个函数想要得到一个可以判等的值:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/13823.html

func makeInt() -> Equatable {
    return 5
}

let intA = makeInt()
let intB = makeInt()

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

但是这样写编译器会报错:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/13823.html

Protocol 'Equatable' can only be used as a generic constraint because it has Self or associated type requirements文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/13823.html

Equatable 的协议中的定义和具体类型有关,上面的例子中编译器不知道 makeInt() 返回的具体类型是哪一个,因此它不能作为一个函数值返回的类型。不能当做一个类型使用,只能用作泛型约束。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/13823.html

如果在原有体系下就只能这样做:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/13823.html

func makeInt<T: Equatable>() -> T {
    return 5 as! T
}

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

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

在使用泛型约束声明后,在代码调用的时候编译器可以通过类型推断出具体类型是什么,因此就满足了 Equatable 的定义。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/13823.html

但是只能用泛型约束声明语法上确实很操蛋。在某些场景下,开发者的函数返回类型是确定的,可不可以编译器自己推断出具体类型,这样就可以不用泛型约束了呢?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/13823.html

想的是真美啊,苹果这就给你实现了:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/13823.html

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

在协议前面标记上 some 后,返回值的类型对编译器就变成透明的了。在这个值使用的时候编译器可以根据返回值进行类型推断得到具体类型。那如果我爱的魔力转圈圈,返回值的类型让编译器猜不到呢?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/13823.html

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

我这样写:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/13823.html

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

好吧,编译器是个狼人。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/13823.html

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

作者:没故事的卓同学
链接:https://juejin.im/post/5cfd434a51882533e13364de
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/13823.html

文章源自菜鸟学院-https://www.cainiaoxueyuan.com/ymba/13823.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/ymba/13823.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定