用enum 來創建一個枚舉。像類和其他的命名類型一樣,枚舉也可以有方法。
enum Rank:Int {
case ace =1
case two, three, four, five, six, seven, eight, nine, ten
case jack,queen,king
func simpleDescription() ->String {
switch self {
case .ace :
return "ace"
case .jack:
return "jack"
case .queen:
return "queen"
case .king:
return "king"
default:
return String(self.rawValue)
}
}
}
let ace = Rank.ace
let aceRawValue = ace.rawValue
默認情況下,Swift 賦值給枚舉的原始值是從0開始,下面的值依次增加,但是你也可以賦一個確切的值。在上面的例子中, Ace有一個確切的值是1,接下來的值就從1開始依次增加。你也可以用字符串或者浮點數字作為枚舉類型。用rawValue屬性去訪問一個枚舉成員的原始值。
使用init?(rawValue:)構造器來從原始值中實例一個枚舉。值得一提的是原始值構造器是一個可失敗的構造器,因為傳入的原始值在枚舉成員中有可能沒有,可以使用值綁定,如果初始化失敗則不走大括號的代碼。
if let convertedRank = Rank(rawValue:3) {
let threeDescription = convertedRank.simpleDescription()
}
枚舉的成員值是實際值,而不是原始值的另一種表達方式。事實上,如果枚舉成員沒有有意義的初始值,你也不必設定一個。
enum Suit {
case spades, hearts, diamonds, clubs
func simpleDescription() -> String {
switch self {
case .spades:
return "spades"
case .hearts:
return "hearts"
case .diamonds:
return "diamonds"
case .clubs:
return "clubs"
}
}
}
let hearts = Suit.hearts
let heartsDescription = hearts.simpleDescription()
注意上面hearts枚舉變量的兩種表達方式。當給hearts常量賦值時,使用Suit.hearts全稱,因為這時還沒有指定hearts常量的類型。在switch里面使用.hearts是因為self已經指定了是Suit枚舉,所以可以省略枚舉名稱。
相關值,枚舉也可以存儲任何類型的相關值,如果需要的話,每個成員的數據類型可以是不同的。
enum Barcode {
case UPCA(Int,Int,Int,Int)
case QRCode(String)
}
var productBarcode = Barcode.UPCA(8,85909,51226,3)
productBarcode = .QRCode("ABCDEFG")
switch productBarcode {
case .UPCA(let A, let B, let C, let D )
print("\(A)\(B)\(C)\(D)")
case .QRCode(let code)
print("\(code)")
}
枚舉成員的值可以是這個枚舉的成員。相同的枚舉成員可以用不同的值。當你創建的時候直接傳值即可。相關值和原始值是不同的:一個枚舉成員的對它的所有實例來說原始值都是相同的,而且當定義枚舉的時候是你提供原始值。比如,考慮從一個服務器獲取日出和日落時間。這個服務器會返回正常結果或者錯誤結果。
enum ServerResponse {
case result (String, String)
case failure (String)
}
let success = ServerResponse.result("6:00 am", "8:09pm")
let failure = ServerResponse.failure("Out of cheese.")
switch success {
case let .result(sunrise, sunset):
print("Sunrise is at \(sunrise) and sunset is at \(sunset).")
case let .failure(message) :
print("Faiure... \(message)")
}
swift使用struct 關鍵字創建一個結構體。結構體支持類的很多行為,包括方法和構造器。結構體和類最重要的區別是結構體在傳遞時可以拷貝內容是值類型,但是類是引用類型。
struct Card {
var rank: Rank
var suit: Suit
func simpleDescription() -> String {
return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"
}
}
let threeOfSpades = Card(rank: .three, suit: .spades)
let threeOfSpadesDescription = threeOfSpades.simpleDescription()