第 14 章
使用 Combine 與 Environment 物件進行資料共享

在第 13 章中,你學到了使用 Form 元件來佈局表單。不過,目前表單還沒有功能,不論你選擇哪個選項,清單視圖都不會反映使用者偏好而有任何改變,這也是我們將在本章中討論與實作的內容。我們將繼續開發設定畫面,並依照使用者的個人偏好更新餐廳清單, 使 App 的功能完善。

具體而言,我們將在後面的小節討論下列主題:

  1. 如何使用列舉(enum)來組織程式碼。
  2. 如何使用 UserDefaults 來永久儲存使用者偏好。
  3. 如何使用 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... 」來建立這個檔案。

圖 14.1 建立一個新的 Swift 檔
圖 14.1 建立一個新的 Swift 檔

建立 SettingStore.swift 之後,將上列的程式碼片段插入檔案中。接下來,回到 Setting View.swift,我們將更新程式碼來使用 DisplayOrder 列舉,而不是使用 displayOrders 陣列。

首先,從 SettingView 刪除下列這行程式碼:

想更深入學習SwiftUI和下載完整程式碼?你可以從 AppCoda網站購買《精通 SwiftUI》完整電子版。

results matching ""

    No results matching ""