本篇原文(標題: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
而我們十分清楚,guitar 是 Band 結構的一部分。
另外一個使用嵌套型別的方法,就是在另一個物件為常數 (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 編輯小姐。