您的位置:首页 > 移动开发 > Swift

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")
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: