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

错误处理

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

public protocol Error{
}

举例

  • LocalizedError CustomNSError 两个是继承 Error 协议的,可以通过继承这两个协议自定义输出错误内容。
  • 样例通过throws关键字抛出异常
  • 使用try关键字处理错误
    -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)