第 14 章
使用 Combine 與 Environment 物件進行資料共享
在第 13 章中,你學到了使用 Form 元件來佈局表單。不過,目前表單還沒有功能,不論你選擇哪個選項,清單視圖都不會反映使用者偏好而有任何改變,這也是我們將在本章中討論與實作的內容。我們將繼續開發設定畫面,並依照使用者的個人偏好更新餐廳清單, 使 App 的功能完善。
具體而言,我們將在後面的小節討論下列主題:
- 如何使用列舉(enum)來組織程式碼。
- 如何使用 UserDefaults 來永久儲存使用者偏好。
- 如何使用 Combine 與 @EnvironmentObject 來共享資料。
如果你還沒有完成第 13 章作業,我鼓勵你花點時間練習。不過,如果你等不及要閱讀本章內容,你可以至下列網址下載範例專案:https://www.appcoda.com/resources/swiftui7/SwiftUIForm.zip 。
使用列舉重構程式碼
我們目前使用一個陣列來儲存「Display Order」的三個選項,它雖然能夠正常運作,不過還有一個更好的方式可以改善程式碼。
列舉為一組相關的值定義一般型別,並使你在程式碼中以型別安全的方式使用這些值。
- Apple 的官方文件 (https://docs.swift.org/swift-book/LanguageGuide/Enumerations.html)
由於這組固定值是和「Display Order」有關,因此我們可以使用列舉( Enum )來存放它們,每個情況(case )指定一個整數值,如下所示:
enum DisplayOrderType: Int, CaseIterable {
case alphabetical = 0
case favoriteFirst = 1
case checkInFirst = 2
init(type: Int) {
switch type {
case 0: self = .alphabetical
case 1: self = .favoriteFirst
case 2: self = .checkInFirst
default: self = .alphabetical
}
}
var text: String {
switch self {
case .alphabetical: return "Alphabetical"
case .favoriteFirst: return "Show Favorite First"
case .checkInFirst: return "Show Check-in First"
}
}
}
使用列舉的優點是我們可在程式碼中以型別安全的方式使用這些值。最重要的是, Swift 中的 Enum 本身就是一級型別,這表示你可以建立實例方法來提供與值相關的附加功能。稍後,我們將會加入一個處理篩選的功能。同時,我們建立一個名為 SettingStore. swift 的新 Swift 檔來儲存 Enum,如圖 14.1 所示,你可以在專案導覽處的 SwiftUIForm 資料夾點擊右鍵,並選取 「 New File from Template... 」來建立這個檔案。

建立 SettingStore.swift 之後,將上列的程式碼片段插入檔案中。接下來,回到 Setting View.swift,我們將更新程式碼來使用 DisplayOrder 列舉,而不是使用 displayOrders 陣列。
首先,從 SettingView 刪除下列這行程式碼:
想更深入學習SwiftUI和下載完整程式碼?你可以從 AppCoda網站購買《精通 SwiftUI》完整電子版。