005-错误处理-元类型、AnyClass、Self

2020-12-30  本文已影响0人  Stronger_J

错误处理

Swift 提供 Error 协议来标识当前应⽤程序发⽣错误的情况,我们的 struct 、 Class 、 enum 都可以通过遵循这个协议来表示⼀个错误。

public protocol Error{
}

举例

enum JsonMapError: Error {
    case emptyKey
    case notConformProtocol
}
extension JsonMapError: LocalizedError{
    var errorDescription: String?{
        switch self {
        case .emptyKey:
            return "emptyKey"
        case .notConformProtocol:
            return "notConformProtocol"
        }
    }
}
extension JsonMapError: CustomNSError{
    var errorCode: Int{
        return 400
    }
}
protocol CustomJsonMap {
    func jsonMap() throws ->  Any
}

extension CustomJsonMap{
    func jsonMap() throws ->  Any {
        let mirror = Mirror(reflecting: self)
        guard !mirror.children.isEmpty else { return self }
        var keyValue: [String : Any] = [:]
        for children in mirror.children {
            print("children: \(children)")
            if let value = children.value as? CustomJsonMap {
                if let keyName = children.label {
                    keyValue[keyName] = try value.jsonMap()
                }else{
                    throw JsonMapError.emptyKey
                }
            }else{
                throw JsonMapError.notConformProtocol
            }
        }
        return keyValue
    }
}

class LJTest: CustomJsonMap {
    var age = 18
    var name = "LJ"
    var height = 1.85
}

extension Int: CustomJsonMap{}
extension String: CustomJsonMap{}

var t = LJTest()
do{
    print(try t.jsonMap())
}catch{
    print(String(describing: (error as? CustomNSError)?.errorCode))
    print("\(String(describing: (error as? LocalizedError)?.errorDescription))")
}

元类型、AnyClass、Self

上一篇 下一篇

猜你喜欢

热点阅读