Swift 枚举关联值

来源:互联网 发布:php mvc项目 编辑:程序博客网 时间:2024/05/29 07:25

枚举关联值介绍

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 ?? "等于")}

关于枚举关联值的两个使用例子:

  1. 定义一个比较大小返回结果的函数
    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 ?? "等于")            }        }    }
  1. 自己封装网络请求时,也可以这么写

网络请求返回结果

    enum ResponseResult {        case json([String:AnyObject]?)        case error(Error?)    }

封装网络请求示例:

    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")            }        }    }