我有一个简单的Swift结构(这恰好是SwiftUI(
这是原作。。。
struct ContentView: View {
var body: some View {
Text("Hello, World!")
}
}
如果我添加一个简单的赋值语句,比如这样,我会得到一堆错误:
struct ContentView: View {
var body: some View {
let x = 1
Text("Hello, World!")
}
}
为什么我会收到这些错误消息?它们是什么意思?(我理解#2,但我不理解#1(为什么我在添加了一个简单的赋值语句后会收到这些消息?
- 函数声明了一个不透明的类型,但在其主体中没有返回语句来推断底层类型
- 从未使用过不可变值"x"的初始化;考虑用对"_"的赋值替换或删除它
- "Text"初始值设定项的结果未使用
在第一段代码中,您将利用单表达式闭包的隐式返回。这意味着,若闭包只包含一行,编译器会隐式返回该行的值。然而,如果您的闭包较长,则需要显式编写return
struct ContentView: View {
var body: some View {
let x = 1
return Text("Hello, World!")
}
}
另外两个只是警告,它们的意思是一样的:你声明了一些东西,但永远不要使用它。你永远不会使用x
,而且由于你不再利用闭包的隐式返回,你也永远不会使用Text
。
Swift 5的一个新特性是,如果方法/计算属性仅由一个返回语句组成,我们可以省略单词return
。所以这个:
func f() -> Int {
return 1
}
可以简化为:
func f() -> Int {
1
}
因此,如果我们扩展第一个代码片段,它就会变成:
var body: some View {
// the word "return" is implicitly added
return Text("Hello, World!")
}
这是一个称为body
的计算属性。
当您再添加一行时,computed属性不再仅由一个返回语句组成,因此现在不能省略单词return
。编译器试图找到返回语句,但找不到,因此出现错误#1。
由于编译器不知道您实际上与returnText(...)
绑定,因此会混淆您为什么调用初始化程序而不使用它,因此出现错误#3。