使用"enum"來(lái)創(chuàng)建一個(gè)枚舉栏渺。就像類和其他所有命名類型一樣,枚舉可以包含方法膀捷。
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
默認(rèn)情況下迈嘹,Swift 按照從"0"開始每次加"1"的方式為原始值進(jìn)行賦值,不過(guò)你可以通過(guò)顯式賦值進(jìn)行改變全庸。在上面的例子中秀仲,"Ace"被顯式賦值為"1",并且剩下的原始值會(huì)按照順序賦值壶笼。你也可以使用字符串或者浮點(diǎn)數(shù)作為枚舉的原始值神僵。使用"rawValue"屬性來(lái)訪問(wèn)一個(gè)枚舉成員的原始值。
使用“init?(rawValue:)”初始化構(gòu)造器在原始值和枚舉值之間進(jìn)行轉(zhuǎn)換覆劈。
if let convertedRank = Rank(rawValue: 3) {
? let threeDescription = convertedRank.simpleDescription()
}
枚舉的成員值是實(shí)際值保礼,并不是原始值的另一種表達(dá)方法。實(shí)際上责语,如果沒(méi)有比較有意義的原始值炮障,你就不需要提供原始值。
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”常量賦值時(shí)胁赢,枚舉成員“Suit.Hearts”需要用全名來(lái)引用,因?yàn)槌A繘](méi)有顯式指定類型白筹。在“switch”里智末,枚舉成員使用縮寫“.Hearts”來(lái)引用,因?yàn)椤皊elf”的值已經(jīng)知道是一個(gè)“suit”徒河。已知變量類型的情況下你可以使用縮寫系馆。
一個(gè)枚舉成員的實(shí)例可以有實(shí)例值。相同枚舉成員的實(shí)例可以有不同的值顽照。創(chuàng)建實(shí)例的時(shí)候傳入值即可由蘑。實(shí)例值和原始值是不同的:枚舉成員的原始值對(duì)于所有實(shí)例都是相同的,而且你是在定義枚舉的時(shí)候設(shè)置原始值代兵。
例如纵穿,考慮從服務(wù)器獲取日出和日落的時(shí)間。服務(wù)器會(huì)返回正常結(jié)果或者錯(cuò)誤信息奢人。
enum ServerResponse {
? case Result(String, String)
? case Failure(String)
}
let success = ServerResponse.Result("6:00 am", "8:09 pm")
let failure = ServerResponse.Failure("Out of cheese.")
switch success {
case let .Result(sunrise, sunset):
? let serverResponse = "Sunrise is at \(sunrise) and sunset is at \(sunset)."
case let .Failure(message):
? print("Failure...? \(message)")
}
注意日升和日落時(shí)間是如何從“ServerResponse”中提取到并與“switch”的“case”相匹配的谓媒。
使用“struct”來(lái)創(chuàng)建一個(gè)結(jié)構(gòu)體。結(jié)構(gòu)體和類有很多相同的地方何乎,比如方法和構(gòu)造器句惯。它們之間最大的一個(gè)區(qū)別就是結(jié)構(gòu)體是傳值土辩,類是傳引用。
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()