小貼士:
你可能會認爲這一章徹底能夠跳過,但除非你是一個 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
組件。。。