美文网首页
005-错误处理-元类型、AnyClass、Self

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

作者: Stronger_J | 来源:发表于2020-12-30 16:22 被阅读0次

    错误处理

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

    public protocol Error{
    }
    

    举例

    • <font color=red> LocalizedError </font>、<font color=red> CustomNSError </font>两个是继承<font color=red> Error </font>协议的,可以通过继承这两个协议自定义输出错误内容。
    • 样例通过<font color=red>throws</font>关键字抛出异常
    • 使用<font color=red>try</font>关键字处理错误
      -1 try?返回一个可选选类型,这⾥的结果就是两类,⼀类是成功,返回具体的字典值;⼀类就错 误,但是具体哪⼀类错误我们不关系,统⼀返回了⼀个nil
      -2 try!表示你对这段代码有绝对的⾃信,这⾏代码绝对不会发⽣错误!
    • do...catch
    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

    • AnyObject:代表任意类的 instance,类的类型,仅类遵守的协议。
    • Any: 代表任意类型,包括 funcation 类型或者 Optional 类型
    • AnyClass 代表任意实例的类型: AnyObject.Type
    • T.self,如果 T是实例对象,返回的就是它本身; T 是类,那么返回的是 Metadata
    • T.Type:⼀种类型, T.self 是 T.Type 类型
    • type(of:) : ⽤来获取⼀个值的动态类型

    相关文章

      网友评论

          本文标题:005-错误处理-元类型、AnyClass、Self

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