创建: 2018/03/05
完成: 2018/03/05
更新: 2018/03/10 改变标题 [Swift4 模式] -> [Swift4 模式, 枚举型]
补充RawRepresentable协议
【任务表】TODO
元组(taple)与switch | |
模式匹配(pattern matching): 检验构造和值是否一致的处理 | |
case来使用元组 | switch的待检验量可以是元组, 所有case列举的实例的型必须一致 switch location { // location: [Int, Int] |
switch里用where | ● 可以对case的元组附加条件 在:前面写 switch sample { // sample: Int ● 可用逗号同时罗列多个条件 如果case里有var/let, 要保证声明的量的值一定会被决定 绝对可行的方法: 声明的量所有匹配量都带 switch sample { // sample: (Int, Int) |
switch里用可选型 | switch sample { // sample: (Int?, Int?) = (a, b) ● 带问号表示可能是nil, 非nil时进行下一步 1? 非nil且为1 nil 为nil _? 非nil, 忽略值 |
枚举型 | |
基本枚举型 | 共有型枚举型的一种 enum 枚举型名 { 例: enum Sample1 { ● 元素可以比较是否相等 ==, != |
方法定义 | 和其他方法定义一样 enum Sample2: CustomStringConvertible { |
值型枚举型 | enum 型名: 实体型 { ● 所有成员都带同类型的值, 值必须各不相同 ● 所带型叫实体型(raw type), 值为实体值(raw value) ● 实体型可为 各种Int, Float/Double, Bool, 字符串, 这些的组合 ● 默认值: 实体型为整数时, 默认第一个第一个为0, 不指定值的为前一个的值+1 字符串时, 不指定则为元素名的字符串, String("元素名") 其他型时必须制定值 ● 获取实体值: rawValue enum Sample3: Int { |
枚举型的构造函数 静态变量, 静态方法 | ● 只可定义计算型属性 var sample: Type { get {...} set {...} } ● 自带构造函数init?(rawValue:) Sample.init(rawValue: ) ● 自定义构造函数 self = 实例 init() { ● 静态变量, 静态方法: 开头加 static 静态变量用作默认值,静态方法用来设定默认值等 |
共用型的枚举型 | |
共用型枚举型 | enum 型名 { 例 enum Sample4 { 生成实例 let myEnumTest4 = Sample4.a("", "") ● 元素不能互相比较 要比较则自己去采用Equalable ● 用在switch里时, 可用下两种方法获取值, 两种方法作用相同 case let Sample4.a(str1, str2) case Sample4.a(let str1, let str2) ● 元组可带标签, switch的case里面可以省略标签 let/var 和标签连用时, 写法注意 case let .(first: a, second: b) case .(first let a, second let b) |
if-case | ● 不带元组的枚举型(简单枚举型), 值型枚举型可以比较 ● 共用型枚举型的比较只能用switch, 除非自己采用Equalable 比较方法 if case模式 = 式, ... { // ,... 相当于where部分 例 if case .a = p { ● , ...可以写模式匹配, 条件句, 可选绑定等 |
for-in中使用case | case也可以用在for-in for case let (a?, ?) in array { // array: [(Int?, Int?)] ● 和普通for-in一样迭代, 只有满足case才会执行代码块 |
采用协议 | 可以采用协议 ● 值型枚举型 自动采用RawRepresentable, 带有rawValue, init?(rawValue:) protocol RawRepresentable { enum 型: 实体型, 协议1, 协议2, ... { ● 共用型枚举型 enum 型: 协议1, 协议2, ... { |
改写自身元组内容的方法(method) | mutating func sample(x: Int) -> Bool { |
递归的构造体 | ● 在需要递归的case前加上indirect enum Sample5 { ● 比较多时可以在enum前加上indirect indirect enum Sample5 { |
可选型与枚举型 | 可选型由共用型枚举型定义 public enum Optional<Wrapped> : ExpressibleByNilLiteral { 以下两用法相同 var sample: Int? = if case let x? = sample { ... } // 不同于if-let: if let x = sample { ... } |
模式匹配(pattern matching) | |
模式匹配的规则 | 略 # TODO: Supply [模式匹配的规则 p186] |
模式匹配运算符 | 模式 ~= 受体 ● 不需要case |