美文网首页SwiftSwift学习程序员
Swift编程(十):通过枚举类型创建函数错误处理机制

Swift编程(十):通过枚举类型创建函数错误处理机制

作者: zZ爱吃菜 | 来源:发表于2016-04-23 16:35 被阅读156次

    写在前面

    欢迎大家关注我的个人博客:<a href="http://blog.noasis.cn" >博客地址</a>,这里主要是我在个人开发时候遇到的坑和挖完的坑,包括 PHP CentOS 以及 Swift 等相关只是

    这篇博文,我将介绍一种通过设置通用型的结果校验枚举,来为函数内建错误处理机制。

    知识点:

    1. 枚举类型
    2. 泛型
    3. 可选型
    4. 结构体
    5. 错误类型

    具体实现

    创建数据结构

    // 创建订单
    struct Order {
        let orderNumber: Int
        let person: Person?
    }
    
    // 创建收件人
    struct Person {
        let name: String
        let address: Address?
    }
    
    // 创建订单地址信息
    struct Address {
        let streetName: String
        let city: String
        let state: String?
    }
    

    创建结果枚举

    enum LookupError: ErrorType {
        case PersonNotFound
        case AddressNotFound
        case StateNotFount
    }
    
    enum OrderResult {
        case Success(String)
        case Error(LookupError)
    }
    

    创建处理函数 返回值是 OrderResult

    func orderInfo(order: Order) -> OrderResult {
        guard let myPerson = order.person else {
            return .Error(.PersonNotFound)
        }
        guard let myAddress = myPerson.address else {
            return .Error(.AddressNotFound)
        }
        guard let myState = myAddress.state else {
            return .Error(.StateNotFount)
        }
        return .Success(myState)
    }
    

    实例数据结构对象:各种情况

    let orderNoPerson = Order(orderNumber: 1, person: nil)
    let orderNoAddress = Order(orderNumber: 2, person: Person(name: "zZ爱吃菜", address: nil))
    let orderNoState = Order(orderNumber: 3, person: Person(name: "zZ爱吃菜", address: Address(streetName: "Fenjiang", city: "Foshan", state: nil)))
    let orderFull = Order(orderNumber: 4, person: Person(name: "zZ爱吃菜", address: Address(streetName: "Fenjiang", city: "Foshan", state: "China")))
    

    创建获取处理结果函数

    func getOrderInfoResult(result: OrderResult) -> String {
        switch result {
        case let .Success(state):
            return "获取地址:\(state)"
        case let .Error(error):
            return "错误原因:\(error)"
        }
    }
    

    各种实例化对象在处理函数中的返回值

    getOrderInfoResult(orderInfo(orderNoPerson))
    
    getOrderInfoResult(orderInfo(orderNoAddress))
    
    getOrderInfoResult(orderInfo(orderNoState))
    
    getOrderInfoResult(orderInfo(orderFull))
    

    效果图

    处理结果图处理结果图

    进阶篇:通用型结果处理枚举

    通用型结果枚举

    上面的枚举,成功是强制返回的是 Success<String> 类型,这样太局限了,假如返回的结果是 Int ?

    // 这样可以制作一个通用型的结果校验枚举,即返回正确时的类型可以自定义,String Int 等等
    enum Result<T>{
        case Success(T)
        case Error(ErrorType)
    }
    

    研究一下 Swift 中的错误处理

    //: ### Swift 中的错误处理
    
    // Swift 内建错误处理机制的局限性在于它必须接住函数的返回类型来触发
    
    // 重写 orderInfo 函数,重构带有错误处理机制的函数
    
    func orderInfo1(order: Order) throws -> String {
        guard let myPerson = order.person else {
            throw LookupError.PersonNotFound
        }
        guard let myAddress = myPerson.address else {
            throw LookupError.AddressNotFound
        }
        guard let myState = myAddress.state else {
            throw LookupError.StateNotFount
        }
        return myState
    }
    
    // 通过 do ... catch 代码块执行带错误处理机制的函数:
    
    do {
        let state = try orderInfo1(orderNoPerson)
        print("地址是:\(state)")
    } catch {
        print("错误原因:\(error)")
    }
    

    结果图

    Swift 函数处理错误机制Swift 函数处理错误机制

    总结:

    枚举类型在 Swift 中是一种很方便我们处理多分枝的数据类型

    enum action {
        case act1
        cate act2
        cate act3
    }
    
    func doAction(act: action) {
        switch act {
            case act1:
                // doSomething
            case act2:
                // doSomething
            case act3:
                // doSomething
        }
    }
    

    Swift 中的错误处理

    // 记住 定义带有错误处理的函数 需要这样生命
    func orderInfo1(order: Order) throws -> String
    
    // 执行带有错误处理的函数 需要这样做 do catch
    
    do {
        let state = try orderInfo1(orderNoPerson
        print("地址是:\(state)")
    } catch {
        print("错误原因:\(error)")
    }
    

    相关文章

      网友评论

        本文标题:Swift编程(十):通过枚举类型创建函数错误处理机制

        本文链接:https://www.haomeiwen.com/subject/qoaxrttx.html