新的SwiftUI教程有以下代码:
struct ContentView: View {
var body: some View {
Text("Hello World")
}
}
第二行是单词some,在他们的网站上突出显示,就好像它是一个关键字一样。
Swift 5.1似乎没有把some作为关键字,而且我不知道some这个词还能在那里做什么,因为它在类型通常的位置。有没有一个新的、未公布的Swift版本?它是一个我不知道的被用在类型上的函数吗?
关键字有的作用是什么?
我将尝试用非常基本的实际示例回答这个问题(这是一个关于什么的不透明结果类型)
假设你有关联类型的协议,并且有两个结构实现它:
protocol ProtocolWithAssociatedType {
associatedtype SomeType
}
struct First: ProtocolWithAssociatedType {
typealias SomeType = Int
}
struct Second: ProtocolWithAssociatedType {
typealias SomeType = String
}
在Swift 5.1之前,下面是非法的,因为ProtocolWithAssociatedType只能用作泛型约束错误:
func create() -> ProtocolWithAssociatedType {
return First()
}
但在Swift 5.1中,这是可以接受的(一些人补充说):
func create() -> some ProtocolWithAssociatedType {
return First()
}
以上是实际使用,广泛用于SwiftUI的一些视图。
但有一个重要的限制-返回类型需要在编译时知道,所以下面的函数声明了一个不透明的返回类型,但其主体中的返回语句没有匹配的底层类型错误:
func create() -> some ProtocolWithAssociatedType {
if (1...2).randomElement() == 1 {
return First()
} else {
return Second()
}
}