Swift摆列详解

程序员 2024-9-9 03:38:10 65 0 来自 中国
和布局体一样,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}
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-24 07:12, Processed in 0.213282 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表