Swift中元組(Tuples),結構體(Struct),枚舉(Enums)之間的區別

由 solar 在 1年前 發佈

元組(tuple)
元組是多個值組成的複合值類型,例如,你可以定義一個含有整形和字符串的tuple

let amout=(100,”EUR”)
當你函數需要返回多個值時,元組這個時候非常有用,你可以使用下標方式來訪問元組中的值,如.0,.1以此類推,如下:

let currency = money.1 // “USD”
如果想要給元組多增加些信息,你也可以給元組每個元素命名:

let money = (amount: 100, currency: “USD”)
現在,你不僅可以通過.1,而且可以通過.currency訪問元素值。

let currency = money.currency // “USD”
如果想給貨幣增加格式化,我們可以這樣做:

func format(input: (Int,String)) -> String {
return “I have (input.0) (input.1) in my wallet”
}

println(format(money)) // This prints “I have 100 USD in my wallet”
我們的格式化方法在任何(Int,String)類型Tuple都能正常運行。

let mass = (1, “kg”)

let formatted = format(mass) // “I have 1 kg in my wallet”
結構體(Struct)
事實上,“我有1kg在我的錢包”沒有任何意義,因此,接下來我們介紹另外一個結構體類型,結構體(struct)不僅能夠有元組類似的數據存儲功能,而且能夠給結構體定義函數(是元組tuple話,只能定義非成員函數來實現),讓我們看看下面的結構體:

struct Money {
let amount: Int
let currency: String
}

let wallet = Money(amount: 100, currency: “USD”)
現在結構體已經有了元組相同的數據存儲功能,現在我們來給他增加一個函數

extension Money {
func format() -> String {
return “I have (self.amount) (self.currency) in my wallet”
}
}

println(wallet.format())
如果我們想給重量mass增加一個特有類型,我們可以這樣做:

struct Mass {
let quantity: Int
let unit: String

func format() -> String {
    return "I have \(self.quantity) \(self.unit) in my backpack."
}

}
現在Money類型不僅有函數,而且有明確的名稱,在後面一部分代碼種,我們不能像mass那樣(1,’kg’)傳參數.結構體也叫nomial type:即明確了定義類型的名稱,如果對象的類型名稱相同即相同的類型,在上面的例子代碼中,mass和第一次定義的wallet對象有相同的類型成員,但是他們的類型Money和Mass的是屬於不同的類型。如果我們調用他們的format函數,會得到不同的結果。

枚舉(Enums)
如果你想要將一些值存儲在一起,我們可以根據具體情況使用tuple或者struct,當然也可以使用classes,但是如果遇到特殊清空,比如,有些時候我們需要在多項值中選擇一個,例如,我們先看看currencies,在之前的代碼中,我們用字符串string來做貨幣單位,假如只允許已知的貨幣在代碼中出現,該怎麼辦? 我們可以使用enum,假如我們只允許有euros,US dollars 和yen,我們可以建立一個enum類型:

enum Currency {
case EUR
case USD
case YEN
}
現在,假如我們有個Current類型的值,我們知道它是EUR、USD or YEN 其中的一種,但是現在沒有辦法表示成員代表其他的具體含義,或者當它同時有多個值時也沒辦法表示.和struct一樣,枚舉也能定義函數。

extension Currency {
func symbol() -> String {
switch self {
case .EUR: return “€”
case .USD: return “$”
case .YEN: return “¥”
}
}
}
我們可以根據需要增加case,當然也可以給枚舉定義只有一個帶實際值的成員:

enum Angle {
case Radian(radians: Double)
}
上面相當一個結構體:可以增加函數,而且區分了Angle的值與double類型值,如果有需要,我們可以給它增加更多的case(枚舉成員)。

該使用哪一種呢?
現在我們總結一下怎麼選擇tuples,struct,enums。首先,優先選擇tuple如果它能勝任.如果有2個值他們有相同的結構(例如:一對String和Int),如想要體現更加類型安全、“名稱化”nominal的類型,那麼應該使用struct,例如,你想要區分currency和mass.最後,如果需要多個值互斥(比如EUR,USD,YEN只能選一),那麼使用枚舉enums。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章