小贴士:
你可能会认为这一章彻底能够跳过,但除非你是一个 Swift 的天才,不然你应该读到最后再肯定。
自 Xcode 11 以后,基本的 Single View App 模板为您提供如下内容:swift
AppDelegate.swift
它负责监视外部事件,例如,若是另外一个应用程序视图向您发送要打开的文件。SceneDelegate.swift
它负责管理应用程序的显示方式,例如让多个实例同时运行,或者当一个实例移动到后台时采起措施。ContentView.swift
这是咱们的初始用户界面。若是这是一个 UIKit 项目,这将是 Xcode 提供给咱们的 ViewController 类。Assets.xcassets
这是一个资产目录,存储着咱们项目中使用的全部图像和颜色。LaunchScreen.storyboard
这是在您的应用加载时显示的屏幕。Info.plist
是一个属性列表文件,在本例中,它用于存储应用程序的系统范围设置 - 例如,在 iOS 主屏幕的图标下面应该显示什么名称。Preview content
一个名为 “预览内容” 的组,其中包含另外一个名为 “预览资产” 的资产目录。就是这样 - 这是一个使人愉快的少许代码和资源,这意味着咱们能够在此基础上进行构建。app
咱们真正关心的是 ContentView.swift ,
事实上,这是惟一重要的部分。这是咱们应用程序的主要功能,在这里咱们能够当即开始尝试各类 SwiftUI
代码。ide
首先,是什么让 ContentView.swift
显示在屏幕上?
好吧,若是你还记得我说过 SceneDelegate.swift
负责管理你的应用程序的显示方式。那么,继续打开 SceneDelegate.swift
,您会看到下面的代码:spa
let window = UIWindow(windowScene: windowScene) window.rootViewController = UIHostingController(rootView: ContentView()) self.window = window window.makeKeyAndVisible()
这段代码建立了一个新的 ContentView
实例(这是咱们即将看到的主要功能),并将其放在 window
中,以便在屏幕上显示。它经过显示 ContentView
的第一个实例,能够有效地引导咱们的应用程序,并从那里结束 - 你想作什么?调试
打开 ContentView.swift
,让咱们看看实际的 SwiftUI 代码。您应该看到这样的代码:code
import SwiftUI struct ContentView : View { var body: some View { Text("Hello World") } } #if DEBUG struct ContentView_Previews : PreviewProvider { static var previews: some View { ContentView() } } #endif
这不是不少代码,但它确实包含了大量代码。component
首先,请注意,ContentView
是一个结构体(struct)。熟悉 UIKit 的开发人员知道,这是巨大的 - 咱们从用户界面的全部值类型的不可变性和简单性中获益!哪些不熟悉 UIKit 的人。。。嗯,只是点头微笑 - 你永远不知道咱们曾经的痛苦。事件
其次,ContentView
符合 View
协议。你想在 SwiftUI 中显示的全部内容都须要符合 View
,这实际上只意味着一件事: 你须要一个名为 body 的属性来返回某种 View。资源
第三,body
的返回类型是 some View
。some
关键字是在 Swift 5.1 中新增的,是一个名为 不透明返回类型的功能的一部分,在这种状况下,它的意思是 “将返回某种视图,但 SwiftUI 不须要知道(或关心)什么。”
重要说明: 返回 some View
意味着 body
属性将返回符合 View
协议的内容。你不能返回不少东西或忘记返回任何东西 -- Swift 编译器将拒绝构建你的代码。要清楚,您的视图正文必须返回一个子视图。开发
第四,body属性中有文本(“hello world”),它建立了文本“hello world”的标签。
最后,在 ContentView 下面的是一个相似但不一样的 struct,称为 ContentView_Previews
。它不符合 View
协议,由于它专门用于在 Xcode 中显示 视图预览(Preview),而不是在真实 app 中显示在屏幕上。这就是为何你会看到它在 #if DEBUG
和 #endif
之间 - 当咱们的应用程序在调试环境中运行时,这段代码只构建在成品(finished product)中,由于它在生产应用程序(Production app)中没有意义。
咱们很快就会更详细地看一下这些组件(components),但首先让咱们看一下 Text
组件。。。