Swift基础语法: 24 - Swift的枚举语法, 匹配枚举值和 Switch 语句, 关联值, 原始值
2015-03-17 11:21
483 查看
在前面, 我们把函数和闭包解决完毕了, 现在让我们来看看Swift中的枚举和Switch:
在Swift中的枚举和OC或者C不太一样, 在Swift中的枚举, 我们可以不必为枚举每一个枚举成员添加一个值, 如果一个值(被认为是“原始”值)被提供给每个枚举成员, 则该值可以是一个字符串, 一个字符, 或是一个整型值或浮点值, 并且在Swift 中,枚举类型是一等(first-class)类型, 废话少说, 让我们来看看例子:
PS: 不像 C 和 Objective-C 一样,Swift 的枚举成员在被创建时不会被赋予一个默认的整数值, 在上面的 CompassPoints 例子中, North, South, East和West不是隐式得等于0, 1, 2 和 3, 相反的, 这些不同的枚举成员在 CompassPoint 的一种显示定义中拥有各自不同的值.
除了这种定义枚举的方式, 我们还有另外一种方式, 比如:
PS: 这种写法更加的简单一些, 但必须得以 “( , )”隔开, 而且每一个枚举成员的首写字母都必须得大写.
在某些情况下, 我们还可以这么使用枚举和Switch, 比如:
PS: 在我们的太阳系中, 就只有地球才有生物生存, 其他星球对人类来说都是很危险的, 所以我们这里匹配的对象就只有地球, 除去地球之外都是危险的, 既然如此, 那么在在Switch中我们就匹配一个就足以了, 其他的星球我们都用default来表示.
PS: 在这里我们可以理解为, UPCA这个枚举成员关联的值是三个Int类型, QRCode的关联值是String类型.
现在我们来正式使用:
在Switch的第一个case中, 如果我们需要三个值都为常量或者变量的时候, 我们除了上面这种写法, 还有第二种更加简洁的写法, 比如:
PS: 在上面的例子中, 如果要在枚举中初始化枚举成员的值时, 必须给该枚举类型设置类型, 并且每一个枚举成员所存储的类型必须一致, 否则就会报错.
在枚举中的原始值和关联值并不一样, 原始值可以存储字符串, 字符, 整型, 浮点型等等, 比如:
这个例子中的枚举类型是Int类型, 并且第一个枚举成员的初始值为1, 如果后面的值没有自定义数值, 那么它们就会自动递增, 我们可以调用一下看看:
PS: 在Int类型下的枚举, 它默认的第一个枚举类型成员数值是从0开始的.
我们也可以通过一个常量的数值来查找枚举里面成员, 并且可以使用Switch来进行匹配, 比如:
好了, 这次我们就讲到这里, 下次我们继续~
1.枚举语法
所谓的枚举其实就是定义一个通用类型的一组相关的值, 使你可以在你的代码中以一个安全的方式来使用这些值。在Swift中的枚举和OC或者C不太一样, 在Swift中的枚举, 我们可以不必为枚举每一个枚举成员添加一个值, 如果一个值(被认为是“原始”值)被提供给每个枚举成员, 则该值可以是一个字符串, 一个字符, 或是一个整型值或浮点值, 并且在Swift 中,枚举类型是一等(first-class)类型, 废话少说, 让我们来看看例子:
enum CompassPoint { case North case South case East case West }
PS: 不像 C 和 Objective-C 一样,Swift 的枚举成员在被创建时不会被赋予一个默认的整数值, 在上面的 CompassPoints 例子中, North, South, East和West不是隐式得等于0, 1, 2 和 3, 相反的, 这些不同的枚举成员在 CompassPoint 的一种显示定义中拥有各自不同的值.
除了这种定义枚举的方式, 我们还有另外一种方式, 比如:
enum CompassPoint { case North, South, East, West } // 使用枚举成员 var directionToHead = CompassPoint.West // 或者 directionToHead = .East
PS: 这种写法更加的简单一些, 但必须得以 “( , )”隔开, 而且每一个枚举成员的首写字母都必须得大写.
2.匹配枚举值和Switch语句
匹配Switch语句的时候, 我们可以这么写, 比如:directionToHead = .South switch directionToHead { case .North: println("Lots of planets have a north") case .South: println("Watch out for penguins") case .East: println("Where the sun rises") case .West: println("Where the skies are blue") } // 打印出来的结果: Watch out for penguins
在某些情况下, 我们还可以这么使用枚举和Switch, 比如:
enum Planet { case Earth, Mars, Pluto } let somePlanet = Planet.Earth switch somePlanet { case .Earth: println("Mostly harmless") default: println("Not a safe place for humans") } // 打印出来的结果: Mostly harmless
PS: 在我们的太阳系中, 就只有地球才有生物生存, 其他星球对人类来说都是很危险的, 所以我们这里匹配的对象就只有地球, 除去地球之外都是危险的, 既然如此, 那么在在Switch中我们就匹配一个就足以了, 其他的星球我们都用default来表示.
3.关联值
在我们现实生活中存在着很多中条形码, 这里我拿两种作为解释, 一种是商品条形码, 一种是我们经常都会看到的二维码, 让我们一起来看看在枚举中是怎么使用的:enum Barcode { case UPCA(Int, Int, Int) case QRCode(String) }
PS: 在这里我们可以理解为, UPCA这个枚举成员关联的值是三个Int类型, QRCode的关联值是String类型.
现在我们来正式使用:
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 identifier, let check):
println("UPC-A with value of \(numberSystem), \(identifier), \(check).")
case .QRCode(let productCode):
println("QR code with value of \(productCode).")
}
// 打印出来的结果: QR code with value of ABCDEFGHIJKLMNOP.
在Switch的第一个case中, 如果我们需要三个值都为常量或者变量的时候, 我们除了上面这种写法, 还有第二种更加简洁的写法, 比如:
switch productBarcode { case let .UPCA(numberSystem, identifier, check): println("UPC-A with value of \(numberSystem), \(identifier), \(check).") case .QRCode(let productCode): println("QR code with value of \(productCode).") } // 打印出来的结果: QR code with value of ABCDEFGHIJKLMNOP.
4.原始值
在枚举中, 我们也可以像OC那样给每一个枚举成员初始化一个值, 这个值在Swift中称为原始值, 比如:enum ASCIIControlCharacter: Character { case Tab = "\t" case LineFeed = "\n" case CarriageReturn = "\r" }
PS: 在上面的例子中, 如果要在枚举中初始化枚举成员的值时, 必须给该枚举类型设置类型, 并且每一个枚举成员所存储的类型必须一致, 否则就会报错.
在枚举中的原始值和关联值并不一样, 原始值可以存储字符串, 字符, 整型, 浮点型等等, 比如:
enum Planet: Int { case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune }
这个例子中的枚举类型是Int类型, 并且第一个枚举成员的初始值为1, 如果后面的值没有自定义数值, 那么它们就会自动递增, 我们可以调用一下看看:
enum Planet: Int { case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune }
let a = Planet.Mars.rawValue
println(a)
// 打印出来的结果是: 4
PS: 在Int类型下的枚举, 它默认的第一个枚举类型成员数值是从0开始的.
我们也可以通过一个常量的数值来查找枚举里面成员, 并且可以使用Switch来进行匹配, 比如:
enum Planet: Int { case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune }
let positionToFind = 9
if let somePlanet = Planet(rawValue:positionToFind) {
switch somePlanet {
case .Earth:
println("Mostly harmless")
default:
println("Not a safe place for humans")
}
} else {
println("There isn't a planet at position \(positionToFind)")
}
// 打印出来的结果: There isn't a planet at position 9
好了, 这次我们就讲到这里, 下次我们继续~
相关文章推荐
- JavaScript基础(基本语法:变量、语句、数组、函数、对象、全局方法以及js与java不同,js与html关联)
- JavaScript基础----07Javascript语法-条件语句switch
- Swift中switch语句的匹配
- Swift语法基础:5 - Swift的枚举和结构体
- 4.8 Swift中switch语句区间和元组模式匹配
- 006--swift基础语法(switch、for循环、for反序遍历)
- 7.2 Swift中switch匹配枚举
- Swift语法基础:19 - Swift的控制转移的语句, Continue, Break, Fallthrough, Labeled Statements
- Java语法基础之选择结构的if语句、switch语句详解
- 4 Java基础语法(switch语句,循环语句(for,while),控制跳转语句(break,return,continue))
- JavaSE8基础 enum 枚举在switch语句中的使用
- 黑马程序员——java第三天:基础语法(三元运算符,while、switch、for语句)
- Swift基础语法(五)枚举、结构体与类的区别
- java语法基础-程序流程控制-选择结构-switch语句
- java基础语法day04(流程控制语句switch、数组)
- Swift中switch语句的匹配
- Swift中switch语句区间和元组模式匹配
- 深入解析Swift中switch语句对case的数据类型匹配的支持
- Swift 基础学习(枚举基本语法)
- Swift语法基础:17 - Swift的For循环, While, Do-While, If, Switch