用enum 來創(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開始崭闲,下面的值依次增加,但是你也可以賦一個(gè)確切的值威蕉。在上面的例子中刁俭, Ace有一個(gè)確切的值是1,接下來的值就從1開始依次增加韧涨。你也可以用字符串或者浮點(diǎn)數(shù)字作為枚舉類型牍戚。用rawValue屬性去訪問一個(gè)枚舉成員的原始值。
使用init?(rawValue:)構(gòu)造器來從原始值中實(shí)例一個(gè)枚舉氓奈。值得一提的是原始值構(gòu)造器是一個(gè)可失敗的構(gòu)造器翘魄,因?yàn)閭魅氲脑贾翟诿杜e成員中有可能沒有,可以使用值綁定舀奶,如果初始化失敗則不走大括號(hào)的代碼暑竟。
if let convertedRank = Rank(rawValue:3) {
let threeDescription = convertedRank.simpleDescription()
}
枚舉的成員值是實(shí)際值,而不是原始值的另一種表達(dá)方式育勺。事實(shí)上但荤,如果枚舉成員沒有有意義的初始值,你也不必設(shè)定一個(gè)涧至。
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枚舉變量的兩種表達(dá)方式腹躁。當(dāng)給hearts常量賦值時(shí),使用Suit.hearts全稱南蓬,因?yàn)檫@時(shí)還沒有指定hearts常量的類型纺非。在switch里面使用.hearts是因?yàn)閟elf已經(jīng)指定了是Suit枚舉,所以可以省略枚舉名稱赘方。
相關(guān)值烧颖,枚舉也可以存儲(chǔ)任何類型的相關(guān)值,如果需要的話窄陡,每個(gè)成員的數(shù)據(jù)類型可以是不同的炕淮。
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)")
}
枚舉成員的值可以是這個(gè)枚舉的成員。相同的枚舉成員可以用不同的值跳夭。當(dāng)你創(chuàng)建的時(shí)候直接傳值即可涂圆。相關(guān)值和原始值是不同的:一個(gè)枚舉成員的對(duì)它的所有實(shí)例來說原始值都是相同的们镜,而且當(dāng)定義枚舉的時(shí)候是你提供原始值。比如润歉,考慮從一個(gè)服務(wù)器獲取日出和日落時(shí)間模狭。這個(gè)服務(wù)器會(huì)返回正常結(jié)果或者錯(cuò)誤結(jié)果。
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 關(guān)鍵字創(chuàng)建一個(gè)結(jié)構(gòu)體踩衩。結(jié)構(gòu)體支持類的很多行為胞皱,包括方法和構(gòu)造器。結(jié)構(gòu)體和類最重要的區(qū)別是結(jié)構(gòu)體在傳遞時(shí)可以拷貝內(nèi)容是值類型九妈,但是類是引用類型。
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()