提示:你可能认为这一章完全可以跳过,但除非你是一个 Swift 天才,否则你应该读到最后,以确定这一点。
基本的 App 模板给了你以下内容:
就是这样--它的代码和资源数量少得令人高兴,这意味着我们可以在此基础上进行开发。
我们真正关心的部分--事实上,在这里它是唯一重要的部分--是 ContentView.swift
。这是我们应用程序的主要功能部分,我们可以在这里开始尝试各种 SwiftUI 代码,只需一会儿。
首先,是什么让 ContentView.swift
显示在屏幕上?
好吧,如果你记得我说过,YourProjectName.swift
负责管理你的应用程序的显示方式。显然,它实际上不叫这个名字--它将根据你在创建项目时选择的项目名称来命名。
现在继续打开这个文件,你会看到里面有这样的代码:
@main
struct YourProjectName: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
这段代码创建了一个新的 ContentView
实例(这是我们即将要研究的主要功能),并把它放在一个窗口组中,使它在屏幕上可见。通过显示 ContentView
的第一个实例,它有效地引导了我们的应用程序,然后就交给我们了--你想做什么?
打开 ContentView.swift
,让我们看看一些实际的 SwiftUI 代码。你应该看到这样的代码:
import SwiftUI
struct ContentView: View {
var body: some View {
Text("Hello, world!")
.padding()
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
这里的代码量不是很多,但它确实包含了很多东西。
首先,注意 ContentView
是一个结构体。熟悉 UIKit 的开发者会知道这一点很重要--我们的用户界面可以从所有的不变性和简单的值类型中获益,不熟悉 UIKit 的人......那就点头微笑吧--你永远不知道我们曾经的痛苦。
第二,ContentView
遵守 View
协议。你想在 SwiftUI 中显示的所有东西都需要遵守 View
,而这实际上只意味着一件事:你需要有一个叫做 body
的属性来返回某种类型的 View
。
第三,body
的返回类型是 some View
。some
关键字是在 Swift 5.1 中引入的,是一个叫做不透明返回类型的功能的一部分,在这种情况下,它的意思就是 "这将返回某种视图,但 SwiftUI 不需要知道(或关心)什么"。
重要。返回 some View
意味着 body
属性将返回遵守 View
协议的东西。你不能忘记返回任何东西--否则 Swift 编译器会拒绝构建你的代码。
第四,在 body
属性里面有 Text("Hello World")
,它创建了一个文本 "Hello World"的标签。
第五,Text
视图下面有一个 padding()
方法调用。在 SwiftUI 中,这实际上创建了一个新的视图,周围有填充物,而不是改变现有的 Text
视图。因此,我们称这些修饰符(modifiers)而不是方法,是因为它们创建了修改过的内容。
最后,在 ContentView
下面有一个类似但又不同的结构,叫做 ContentView_Previews
。它不遵守 View
协议,因为它是专门用来在 Xcode 中显示视图预览的,而不是在真正的应用中显示在屏幕上。这段代码只有在我们的应用程序在调试环境中运行时才被内置到成品中,因为它在生产应用程序中没有意义。
我们很快就会更详细地了解这些组件,但首先让我们来看看 Text
组件...