Swift学习笔记之枚举
相关值 - Associated ValuesSwift 中的相关值有点像是 F# 中的 Discriminated Unions,它允许在枚举中存储额外的数据。 比如这样一个网络请求结构体, struct NetRequest { enum Method { case GET case POST(String) }
var URL: String
var method: Method } var getRequest = NetRequest(URL: "http://drewag.me",method: .GET) var postRequest = NetRequest(URL: "http://drewag.me",method: .POST("{"username": "drewag"}"))
比如下面这个 Barcode 的例子。枚举类中定义了两种条形码,一种是普通的条形码 enum Barcode {
case UPCA(Int,Int,Int)
case QRCode(String)
}
var productBarcode = Barcode.UPCA(8,85909,51226,3)
productBarcode = .QRCode("ABCDEFGHIJKLMNOP")
switch productBarcode {
case .UPCA(let numberSystem,let manufacturer,let product,let check):
println("UPC-A: (numberSystem),(manufacturer),(product),(check).")
case .QRCode(let productCode):
println("QR code: (productCode).")
}
// prints "QR code: ABCDEFGHIJKLMNOP."
这个挺有意思,如果我们要比较两个枚举变量,比如 答案是:都不对。Xcode会报错告诉你 func ==(a:Barcode,b:Barcode) -> Bool {
switch(a) {
case let .UPCA(a1,b1,c1,d1):
switch(b) {
case let .UPCA(a2,b2,c2,d2):
return (a1 == a2 && b1 == b2 && c1 == c2 && d1 == d2)
default:
return false
}
case let .QRCode(a1):
switch(b) {
case let .QRCode(a2):
return a1 == a2
default:
return false
}
}
}
enum Barcode {
case UPCA(Int,Int)
case QRCode(String)
}
var code1 = Barcode.UPCA(8,3)
var code2 = Barcode.UPCA(8,4)
code1 == code2 // false
如果没有相关值是可以直接比较的: enum Numbers: Int {
case One = 1,Two,Three,Four,Five
}
var possibleNum1 = Numbers.Three
var possibleNum2 = Numbers.Three
println(possibleNum1 == possibleNum2) // true
可选类型就是相关值应用的最好的例子: enum Optional {
case None
case Some(T)
}
可以试一下: var a: String?
a = "a" // {Some "a"}
a == .None // false
a == .Some("a") // true
原始值 - Raw Values我们可以给枚举类型的成员用默认值填充,比如下面这个例子,成员的类型为 Character : enum ASCIIControlCharacter: Character {
case Tab = "t"
case LineFeed = "n"
case CarriageReturn = "r"
}
原始值可以是 ASCIIControlCharacter.Tab.rawValue // rawValue = t
也可以用 var a = ASCIIControlCharacter(rawValue: "t")
a?.rawValue // {Some "t"}
遍历我们可以通过 enum ProductCategory : String {
case Washers = "washers",Dryers = "dryers",Toasters = "toasters"
static let allValues = [Washers,Dryers,Toasters]
}
for category in ProductCategory.allValues{
//Do something
}
用处用好枚举类型可以有效的提高代码的可读性,比如我们在 override func prepareForSegue(segue: UIStoryboardSegue!,sender: AnyObject!) {
if let identifier = SegueIdentifier.fromRaw(segue.identifier) {
switch identifier {
case .OtherScreenSegue1:
println("Going to other screen 1")
case .OtherScreenSegue2:
println("Going to other screen 2")
case .OtherScreenSegue3:
println("Going to other screen 3")
default:
println("Going somewhere else")
}
}
}
同理,也可以用在 其他发现一个挺好的网站:SwiftExamples,通过例子演示 Swift 的各种语法,如果一时半会的忘了某个语法可以去看一看。 References
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |