和布局体一样,swift中的摆列也是值范例。除了界说一个或多个case成员,还可以做以下变乱:
- 可以界说方法,盘算属性,下标
- 可以通过mutating界说可变方法
- 可以扩展,服从协议,支持范型
和布局体的唯一区别就是摆列不能界说存储属性
1. 摆列的语法:
enum TextAlignment{ case left case right case center}//大概 写在一行enum TextAlignment{ case left, right, center}2. 服从协议&遍历摆列值
比方:体系自带的CaseIterable协议,allCases属性列出所有的摆列成员,也可以通过手动添加盘算属性或方法到达同样的目的,对于没有关联值的摆列,编译器会自动为实在现allCases(成员次序和声明时间同等)
extension TextAlignment:CaseIterable{}TextAlignment.allCases // left right center// 大概 手动添加盘算属性extension TextAlignment { static var allCases: [TextAlignment] { [.left,.right,.center] }}3. 原始值、隐式赋值
C或Objective-C中的摆列,是可以通过0 1 2 3...来初始化和利用。Swift摆列默认不会为每个成员分配0 1 2 3...也不能通过整数初始化摆列。要想得到这种特性,必须添加原始值。语法如下
enum TextAlignment:Int {}原始值可以是字符串、字符或任何整数或浮点数范例。但是每个值对应的原始值必须是唯一的。
enum TextAlignment:String { case left = "0" case right = "1" case center = "2"}通过rawValue创建的摆列值是可选的?
var aligent = TextAlignment(rawValue:"1") // Optional(TextAlignment. right)RawRepresentable协议
实现 RawRepresentable 协议的范例会得到两个新的 API:一个 rawValue 属性和一个可失败的初始化方法 (init?(rawValue),编译器自动为具有原始值的摆列实现这个协议。
编译器会通过递增前一个成员的原始值来给下一个摆列成员赋值。
enum TextAlignment:Int{ case left case right case center}// 体系会自动分配 0 ,1,2给成员var alignment : TextAlignment = .center alignment.rawValue // 2原始值是String的时间,默认环境下体系用 case 值来初始化摆列原始值:
enum TextAlignment:String{ case left case right case center}var alignment: TextAlignment = .leftprint(alignment.rawValue) // "left"4. 摆列关联值
原始值与关联值差别,摆列成员一旦设置了原始值利用中就不能在变,关联可以根据利用变革。
一个确定摆列值加上其关联值可以使的该摆列范例有更多的成员,Swift可以摆列成员关联任意范例的值
enum TextAlignment{ case left(String) case right(String) case center(CGFloat,CGFloat)}5. 摆列支持范型&关联值
范型是Swift最强盛的功能之一,Swift标准库的大部分都是用通用代码构建的。它能使您编写机动、可重用的函数和范例,这些函数和范例可以根据您界说的要求实用于任何范例,克制重复的代码。
关于摆列的范型,看如下的例子:
界说范型摆列Result
// 界说范型摆列Resultenum Result<Success, Failure>{ case success(Success) case failure(Failure)}利用Result
struct LError:Error{ var message = "错误信息"}// 网络哀求效果var result:Result<Dictionary, LError > = .success(["code":"200"])// 失败时 result = .failed(LError(message: "404"))//通过switch匹配效果switch result{case.success(let data): print(data)case.failed(let error): let ler = error as! LError print(ler.message)}现实上,范型摆列都是和关联值团结利用的。Swift自带的Result范例也是这种情势的摆列。
如果我们要从当地磁盘读取文件,这个过程大概会失败,可以设定读取效果可选?如许以来,读取失败就会返回nil,但是我们不知道失败的缘故原由,Result就可以表达那些必要提供具体信息的错误。如果我们不关注错误缘故原由,直接忽略failed背面的关联值即可(下文有报告如何忽略关联值)。
- 摆列利用就简单先容到这里,接下来重点看摆列的利用和模式匹配。
Swift 要求摆列必须思量到每一种环境,最常用方法就是利用 switch 语句
普通摆列,没有关联值的环境
var aligent:TextAlignment = .left// 模式匹配 ,所有环境 left, right,centerswitch aligent{case .left: breakcase .right: breakcase .center: break}通配符 _ ,下划线匹配任意值并忽略这个值,等同default
// default 忽略switch aligent {case .left: breakdefault: break}// 通配符 _ switch aligent {case .left: breakcase _ : break}匹配多个值的环境,多个摆列值可以写在一行,也可以利用通配符_,default。
// 匹配多个的环境switch aligent {case .left,.right: breakcase .center: break}除了switch之外,也可以用if 和if case 匹配
if aligent == .left{ // do ... }if case .left = aligent { // do ... }值绑定模式,像处置惩罚可选值一样,可以把摆列的关联值绑定到一个let or var 声明的变量上,带关联值的摆列如下:
var aligent1:TextAlignment = .left("left")var aligent2:TextAlignment = .center(0, 0)// 值绑定模式switch aligent1 {case .left(let string): //绑定到变量 string breakcase .right(let string): breakcase .center(let x, let y): //绑定到变量x,y break}// let写在前面也是可以的switch aligent1 {case let.center(x, y): breakcase let.right(str): breakcase _: break}如果想忽略关联值,可以按照编译器提示用下划线_忽略,大概不写背面的括号()
// 用下划线_忽略switch aligent1 {case .left(_): breakcase .right(_): breakcase .center(_,_): break}// 不写背面的括号()switch aligent1 {case .left: breakcase .right: breakcase .center: break}关联值有单个or多个,匹配确定的关联值。
// 匹配确定的关联值 center(x,y)中的x=0,y=0的环境switch aligent1 {case .center(0,_): breakcase _: break}// 只匹配确定的关联值 center(x,y)中的x=0的环境switch aligent1 {case .center(0,_): breakcase _: break} |