错误处理
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:) : ⽤来获取⼀个值的动态类型