创建: 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]
case (, ): // 具体值来匹配
...
case (..<, ...): // 匹配元素可以使用范围来判定
...
case (, _): //匹配元组第一个元素, 第二个无论是什么都成立
...
case (var a, ): // 需要获取时候直接声明var/let
...
default:
...
}

switch里用where

● 可以对case的元组附加条件

在:前面写

switch sample { // sample: Int
case :
...
case let a where a > : // where写在匹配标签和:之间
...
default:
...
}

● 可用逗号同时罗列多个条件

如果case里有var/let, 要保证声明的量的值一定会被决定

绝对可行的方法: 声明的量所有匹配量都带

switch sample { // sample: (Int, Int)
case (let a, 1), (10, 9) // 错误, (10, 9) 时a无法确定值
...
case (let a, ), (let a, ) where a == : // 可以, 所有标签都带a, a一定会被决定
...
case let (a, b) where a == b, let (a, b) where a == a*b: // 每一个标签都可以单独带where
...
default: ...
}
 switch里用可选型 
switch sample { // sample: (Int?, Int?) = (a, b)
case (?, ?): // a,b都存在且a = 1, b = 2
...
case ((..<)?, ?) // a, b都存在且a属性1..<9, b = 2
...
default:
...
}

● 带问号表示可能是nil, 非nil时进行下一步

1?   非nil且为1

nil   为nil

_?  非nil, 忽略值

   
   
枚举型

基本枚举型

共有型枚举型的一种 

enum 枚举型名 {
case 枚举型实例 // 多个也可以用,连接
case ...
   ...
}

例:

enum Sample1 {
case a
case b
case c
case d
} enum Sample2 {
case a, b, c, d
}

● 元素可以比较是否相等 ==, !=

 方法定义 

和其他方法定义一样

enum Sample2: CustomStringConvertible {
case a, b, c, d
func getNext() -> Sample2 {
switch self {
case .a:
return .b
case .b:
return .c
case .c:
return .d
case .d:
return .a
}
}
var description: String {
return "\(self.hashValue)"
}
}
let myEnumTest2: Sample2 = .a
print(myEnumTest2) //
print(myEnumTest2.getNext()) //
 值型枚举型 
enum 型名: 实体型 {
case 元素名 = 值 // 值可以不设定, 具体见下方默认值说明
...
}

● 所有成员都带同类型的值, 值必须各不相同

● 所带型叫实体型(raw type), 值为实体值(raw value)

● 实体型可为 各种Int, Float/Double, Bool, 字符串, 这些的组合

● 默认值:

  实体型为整数时, 默认第一个第一个为0, 不指定值的为前一个的值+1

             字符串时, 不指定则为元素名的字符串, String("元素名")

  其他型时必须制定值

● 获取实体值: rawValue

enum Sample3: Int {
case a=, b, c, d
}
let myEnumTest3: Sample3 = .d
print(myEnumTest3.rawValue) //

枚举型的构造函数

静态变量, 静态方法

只可定义计算型属性 var sample: Type { get {...} set {...} }

● 自带构造函数init?(rawValue:)

Sample.init(rawValue: )

● 自定义构造函数

self = 实例

init() {
self = Sample3.a
}

● 静态变量, 静态方法: 开头加 static

静态变量用作默认值,静态方法用来设定默认值等

   
   
共用型的枚举型
 共用型枚举型

enum 型名 {
case 元素名 元组定义 // 可以省略元组定义, 即最简单的枚举型
...
}

enum Sample4 {
case a (String, String)
case b (Int)
case c (first: Int, second: String) // 可以带标签
case d
}

生成实例

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 {
...
} if case let .a(x, y) = p {
...
} if case .t(, let y)? = p { // p不是nil, p.x=10
...
}

● , ...可以写模式匹配, 条件句, 可选绑定等

 for-in中使用case

case也可以用在for-in

for case let (a?, ?) in array { // array: [(Int?, Int?)]
print("a = \(a)")
}

● 和普通for-in一样迭代, 只有满足case才会执行代码块

 采用协议

可以采用协议

● 值型枚举型

自动采用RawRepresentable, 带有rawValue, init?(rawValue:)

protocol RawRepresentable {
associatedtype RawValue
init?(rawValue: Self.RawValue)
public var rawValue: Self.RawValue { get }
}
enum 型: 实体型, 协议1, 协议2,  ... {
...
}

● 共用型枚举型

enum 型: 协议1, 协议2, ... {
...
}
 改写自身元组内容的方法(method)

mutating func sample(x: Int) -> Bool {
switch self {
case let .(, a, b)
     self = .d // 把自己self完全替换为新元素
return a > x
...
}
 递归的构造体

● 在需要递归的case前加上indirect

enum Sample5 {
indirect case ...:
...
...
}

● 比较多时可以在enum前加上indirect

indirect enum Sample5 {
case ...:
...
...
}
 可选型与枚举型

可选型由共用型枚举型定义

public enum Optional<Wrapped> : ExpressibleByNilLiteral {
case none
case some(Wrapped)
public init(_ some: Wrapped)
...
}

以下两用法相同

var sample: Int? = 

if case let x? = sample { ... } // 不同于if-let: if let x = sample { ... }
if case let .some(x) = sample { ... }
   
   
   
模式匹配(pattern matching)
 模式匹配的规则

略  # TODO: Supply [模式匹配的规则 p186]

 模式匹配运算符

模式 ~= 受体

● 不需要case

   
   
   
   
   
   
   
   

Swift4 模式, 枚举型的更多相关文章

  1. 枚举型Enum和结构型Stuct

    枚举型实质就是使用符号来表示的一组相互关联的数据. Season currentSeason,nextSeason; currentSeason = Season.Spring; nextSeason ...

  2. 备忘录模式 Memento 快照模式 标记Token模式 行为型 设计模式(二十二)

    备忘录模式 Memento   沿着脚印,走过你来时的路,回到原点.     苦海翻起爱恨   在世间难逃避命运   相亲竟不可接近   或我应该相信是缘份   一首<一生所爱>触动了多少 ...

  3. FactoryMethod工厂方法模式(创建型模式)

    1.工厂方法模式解决的问题 现在有一个抽象的游戏设施建造系统,负责构建一个现代风格和古典风格的房屋和道路. 前提:抽象变化较慢,实现变化较快(不稳定) 整个抽象的游戏设施建造系统相对变化较慢,本例中只 ...

  4. Prototype原型模式(创建型模式)

    1.原型模式解决的问题 现在有一个抽象的游戏设施建造系统,负责构建一个现代风格和古典风格的房屋和道路. 前提:抽象变化较慢,实现变化较快(不稳定) 整个抽象的游戏设施建造系统相对变化较慢,本例中只有一 ...

  5. java中枚举型的定义以及使用

    1.如何定义枚举型 public enum gender{ GEN1("男","1"), GEN2("女","0"); ...

  6. 枚举型变量 ErrorStatus HSEStartUpStatus及使用

    ErrorStatus和C语言中的int .char一样,后面定义的HSEStartUpStatus是这个变量.举例,你的ErrorStatus 代表bool类型的0或者1. typedef enum ...

  7. MySQL进阶12-- 数据类型介绍: 数值型/字符型/日期型-- 正负溢出保护/枚举型/set型/时间戳

    /*进阶12 SQL 数据类型介绍 数值型: 整数: Tinyint(1b) < mediumint(3b)<smallint(2b) <int(4b) <bigint(8b) ...

  8. 工厂方法模式——创建型模式02

    1. 简单工厂模式     在介绍工厂方法模式之前,先介绍一下简单工厂模式.虽然简单工厂模式不属于GoF 23种设计模式,但通常将它作为学习其他工厂模式的入门,并且在实际开发中使用的也较为频繁. (1 ...

  9. Java 正则表达式匹配模式[贪婪型、勉强型、占有型]

    Greediness(贪婪型):最大匹配 X?.X*.X+.X{n,} 是最大匹配.例如你要用 “<.+>” 去匹配 “a<tr>aava </tr>abb”,也许 ...

随机推荐

  1. java比较两个日期大小

    方法一 /** * 比较两个日期之间的大小 * * @param d1 * @param d2 * @return 前者大于后者返回true 反之false */ public boolean com ...

  2. Android时时监測手机的旋转角度 依据旋转角度确定在什么角度载入竖屏布局 在什么时候载入横屏布局

    一.场景描写叙述: 最近开发中遇到个问题,就是我们在做横竖屏切换的功能时.横竖屏布局是操作系统去感知的,作为开发员没法确定Activity在什么时候载入横屏布局,在什么时候载入竖屏布局.因此为了找到载 ...

  3. 自己定义控件 播放GIF动画

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...

  4. 程序运行中(BSS段、数据段、代码段、堆栈)

    程序运行中(BSS段.数据段.代码段.堆栈) BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简 ...

  5. INTERSECT(交集)集合运算

    在集合论中,两个集合(记为集合A和B)的交集是由既属于A,也属于B的所有元素组成的集合. 在T-SQL 中,INTERSECT 集合运算对两个输入查询的结果集取其交集,只返回在两个查询结果集中都出现的 ...

  6. Eclipse 变量点击高亮显示以及自己定义高亮显示颜色

    1.方法一:alt+shift+o 打开/关闭,该功能 2.方法二:windows-> preferences->java->Editor->Mark Occurences ( ...

  7. MongoDB数据库的初识

    1,MongoDB是基于分布式文件存储的数据库,有c++语言编写,旨在为WEB应用提供可扩展的高效性能数据存储解决方案. MongoDB是一个介于关系型数据库和非关系数据库之间的产品,是非关系数据库当 ...

  8. 头文件与cpp文件为什么要分开写

    最表面的机制是: 头文件是程序的界面(是代码界面),提供给程序员以  类.模版.函数等一系列的声明,让程序员知道应该怎么调用里面的"东西". 从动态链接库的角度看: 头文件提供界面 ...

  9. Delphi中accesss实现树形结构查询系统(一次性生成比较方便)

    主要是要读取数据库的信息,而delphi界面是一个树形结构. 例如有一个Ascess数据库:示例.MDB,内有一张表:“国家”,表的内容如下: 编号        名称  01             ...

  10. Spring Security调研记录【七】--核心模型与实现

    网上有非常多关于Spring Security文章中,都觉得Spring Security(相对于shiro)过于复杂,个人觉得复杂的是Spring Security的官方文档而不是Spring Se ...