Swift 枚举关联值
2017-05-23 20:57
295 查看
枚举关联值介绍
Swift 的枚举中可以把其他类型的关联值和成员值一起存储起来使用,这样使你连同成员值一起存储额外的自定义信息,并且你每次在代码中使用该枚举成员时,还可以修改这个关联值。你可以定义 Swift 枚举来存储任意类型的关联值,如果需要的话,每个枚举成员的关联值类型可以各不相同。
比如一个比较大小的结果的枚举:
enum ResultCode { case bigger(String?) case smaller(String?) case equal(Int?) }
以上代码可以理解为一个 ResultCode 的枚举类型,它的两个成员值是具有 (String?) 类型关联值的 bigger,small 。另外一个成员是具有 Int 类型关联值的 equal
然后我们可以创建一个新的 ResultCode 实例,例如:
var result1 = ResultCode.bigger("bigger")
上面例子创建了一个名为 result1 的变量,并将 ResultCode.bigger 赋值给它,关联的值为 “bigger”
result1 = .smaller("smaller")
代码中,原始的 ResultCode.bigger 和其整数关联值被新的 ResultCode.smaller 和其字符串关联值所替代。 ResultCode类型的常量和变量可以存储一个 .bigger 或者一个 .smaller , 但是在同一时间只能存储这两个值其中的一个。
像一般的枚举一样,可以使用一个 switch 语句来检查不同的条形码类型。 然而,这一次,关联值可以被提取出来作为 switch 语句的一部分。你可以在 switch 的 case 分支代码中提取每个关联值作为一个常量或者变量来使用
switch result { case .bigger(let str1): print(str1 ?? "大于") case .small(let str2): print(str2 ?? "小于") case .equal(let str3): print(str3 ?? "等于") }
如果一个枚举成员的所有关联值都被提取为常量,或者都被提取为变量,为了简洁,你可以只在成员名称前标注一个 let 或者 var:
switch result { case let .bigger(str): print(str ?? "大于") case let .smaller(str): print(str ?? "小于") case let .equal(str): print(str ?? "等于") }
关于枚举关联值的两个使用例子:
定义一个比较大小返回结果的函数func comparaNums(_ num1: Int, _ num2:Int ,completedHandler:(ResultCode) -> ()) { if num1 > num2 { completedHandler(.bigger(">")) }else if num1 < num2{ completedHandler(.smaller("<")) }else{ completedHandler(.equal(num1)) } }
调用此比较方法
override func viewDidLoad() { super.viewDidLoad() comparaNums(3, 3) { (result) in switch result { case .bigger(let str1): print(str1 ?? "大于") case .smaller(let str2): print(str2 ?? "小于") case .equal(let str3): print(str3 ?? "等于") } } }
自己封装网络请求时,也可以这么写
网络请求返回结果
enum ResponseResult { case json([String:AnyObject]?) case error(Error?) }
8cf7
封装网络请求示例:
func getData(_ urlStr:String, completedHandler:@escaping(ResponseResult)->()) { Alamofire.request(urlStr).responseJSON { (response) in if let json = response.result.value as? [String:AnyObject] { completedHandler(.json(json)) }else{ if let error = response.error { completedHandler(.error(error)) } } } }
调用示例:
override func viewDidLoad() { super.viewDidLoad() getData("testurl") { (result) in switch result { case .json(let result): //do something print(result ?? "json") case .error(let error): //do something print(error ?? "error") } } }
相关文章推荐
- Swift基础语法: 24 - Swift的枚举语法, 匹配枚举值和 Switch 语句, 关联值, 原始值
- Swift-枚举关联值以及提取
- 7.6 Swift中switch提取枚举关联值
- 自定义数据类型 --- 枚举类型全解(swift2.3)
- Swift编程语言学习11—— 枚举全局变量、局部变量与类型属性
- iOS学习笔记44-Swift(四)枚举和结构体
- Swift学习之-枚举
- 枚举enum(Swift)
- Swift第六课枚举,枚举中定义方法,结构体
- Swift之高级运算符与枚举
- OC枚举和Swift 枚举
- 窥探Swift之别样的枚举类型
- swift 数组、字典、集合、结构体、枚举——swift学习(四)
- swift学习笔记之枚举
- ios深度解析之Swift(枚举,继承,协议,扩展)
- 枚举_Swift基础知识学习
- Swift语言学习4--枚举和结构体
- swift枚举
- Swift 枚举
- 苹果新的编程语言 Swift 语言进阶(七)--枚举、结构、类