Swift 程式語言

善用 Swift 的嵌套物件功能 編寫出更清晰的程式碼

Swift 其中一個功能,就是以嵌套方式在其他物件中定義物件型別 (type)。在這篇文章中,Alessandro 會帶大家了解 Swift 的嵌套物件功能,編寫出更清晰的程式碼。
善用 Swift 的嵌套物件功能 編寫出更清晰的程式碼
Photo by Nahima Aparicio on Unsplash
In: Swift 程式語言
本篇原文(標題:Nested Objects in Swift)刊登於作者 Medium,由 Alessandro Manilii 所著,並授權翻譯及轉載。

Swift 是一種了不起的語言,讓我們可以構建許多很好的結構,來編寫出更好的程式碼。其中一個功能,就是以嵌套方式在其他物件中定義物件型別 (type),我們可以在程式碼中建立一個類似「俄羅斯娃娃」的階層結構。

讓我們舉個例子。現在我們的 App 需要一個描述一隊 Rock Band 的結構,當中包括了不同的演奏者。我們就會創建一個 Band struct,並在裡面定義一個 enum,來描述每個成員演奏的樂器:

struct Band {
    enum MusicianType {
        case singer
        case guitar
        case keyboard
        case bass
        case drums
    }
    private var members: [MusicianType]
    private (set) var name: String
    init(name: String, members: [MusicianType]) {
        self.name = name
        self.members = members
    }
    var description: String {
        “\(name) are made by \(members.count) members”
    }
}

然後,現在我們就可以這樣輕鬆地實例化物件:

let band01 = Band(
    name: “Dream Theater”,
    members: [.singer, .bass, .drums, .guitar, .keyboard]
)
let band02 = Band(
    name: “Iron Maiden”,
    members: [.singer, .bass, .guitar, .guitar, .guitar, .drums]
)

我們其實也可以在 Band struct 外面定義 MusicianType,但因為它在邏輯上與 owner 結構緊密耦合,所以在 Band 裡面定義它就會更加清晰。

另外,如果在一個中型 App 中,我們最終可能會有幾十個小物件,只在某一個類別中使用,那我們就應該考慮使用嵌套型別了。

如果我們需要在 App 的其他地方使用 MusicianType,就可以這樣調用它:

let guitarPlayer = Band.MusicianType.guitar

而我們十分清楚,guitarBand 結構的一部分。

另外一個使用嵌套型別的方法,就是在另一個物件為常數 (constant) 創建一個 struct

比如說,我們有一個生物辨識管理器 (biometric manager),需要根據使用者的行為,來顯示不同的訊息。 我們就可以如此編寫程式碼:

final class PBBiometricAuthManager {
  struct Constant {
    static let appTitle = localized(“appTitle”
    static let authRequired = localized(“authRequired”)
    static let sessionCancelled = localized(“sessionCancelled”)
    static let tryAgain = localized(“tryAgain”)
    static let manualLogin = localized(“manualLogin”)
    static let touchIDNotEnrolled = localized(“touchIDNotEnrolled”)
    static let faceIDNotEnrolled = localized(“faceIDNotEnrolled”)
    static let passcodeNotSet = localized(“passcodeNotSet”)
    static let touchIDNA = localized(“touchIDNotAvailable”)
    static let faceIDNA = localized(“faceIDNotAvailable”)
    static let biometricSensorNA = localized(“noBiometricSensor”)
    static let close = localized(“close”)
}
  // Lots of code here…
}

我們把常數定義為 static,如此一來,我們就不需要實例化結構,可以簡易地調用它:Constant.appTitle

在之後的文章中,我會介紹如何利用嵌套型別,來編寫出更好、更清晰的程式碼!

祝你編程愉快!

如果你喜歡這篇文章,而又尚未加入 Medium 會員,希望你考慮加入。你可以透過我的推薦連結,支持我寫出更好的文章。

本篇原文(標題:Nested Objects in Swift)刊登於作者 Medium,由 Alessandro Manilii 所著,並授權翻譯及轉載。
作者簡介:Alessandro Manilii,一名意大利的專業 iOS 開發者,Wakala 的 iOS Tech Lead。你可以透過我的推薦連結加入 Medium 會員。
譯者簡介:Kelly Chan-AppCoda 編輯小姐。
作者
AppCoda 編輯團隊
此文章為客座或轉載文章,由作者授權刊登,AppCoda編輯團隊編輯。有關文章詳情,請參考文首或文末的簡介。
評論
更多來自 AppCoda 中文版
Swift 5.5 的新語法和機制 讓我們用最直觀的方式撰寫非同步程式
Swift 程式語言

Swift 5.5 的新語法和機制 讓我們用最直觀的方式撰寫非同步程式

Swift 5.5 導入了新的非同步任務機制,包括了 async/await、Actor、Task Group 等等好用的工具,還有針對既有的 SwiftUI、Core Data、跟許多 Foundation 下的 API 所做的 async/await 封裝。有了這些新的語法跟機制,我們就可以用非常直觀的方式來撰寫非同步的程式,提升程式碼的可讀性,同時也大幅降低出錯的機率。
很好! 你已成功註冊。
歡迎回來! 你已成功登入。
你已成功訂閱 AppCoda 中文版 電子報。
你的連結已失效。
成功! 請檢查你的電子郵件以獲取用於登入的連結。
好! 你的付費資料已更新。
你的付費方式並未更新。