内容简介:。我开始以为是 SwiftUI 自带的属性,后来经网友提醒发现是 Swift 5.1 的新特性。举个例子:我们有一个函数想要得到一个可以判等的值:
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
后,返回值的类型对编译器就变成透明的了。在这个值使用的时候编译器可以根据反回值进行类型推断得到具体类型。
那如果我爱的魔力转圈圈,返回值的类型让编译器猜不到呢?
我这样写:
好吧,编译器是个狼人。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
数据密集型应用系统设计
Martin Kleppmann / 赵军平、李三平、吕云松、耿煜 / 中国电力出版社 / 2018-9-1 / 128
全书分为三大部分: 第一部分,主要讨论有关增强数据密集型应用系统所需的若干基本原则。首先开篇第1章即瞄准目标:可靠性、可扩展性与可维护性,如何认识这些问题以及如何达成目标。第2章我们比较了多种不同的数据模型和查询语言,讨论各自的适用场景。接下来第3章主要针对存储引擎,即数据库是如何安排磁盘结构从而提高检索效率。第4章转向数据编码(序列化)方面,包括常见模式的演化历程。 第二部分,我们将......一起来看看 《数据密集型应用系统设计》 这本书的介绍吧!