錯(cuò)誤處理
Swift 提供 Error 協(xié)議來(lái)標(biāo)識(shí)當(dāng)前應(yīng)?程序發(fā)?錯(cuò)誤的情況努隙,我們的 struct 球恤、 Class 、 enum 都可以通過(guò)遵循這個(gè)協(xié)議來(lái)表示?個(gè)錯(cuò)誤荸镊。
public protocol Error{
}
舉例
- <font color=red> LocalizedError </font>咽斧、<font color=red> CustomNSError </font>兩個(gè)是繼承<font color=red> Error </font>協(xié)議的,可以通過(guò)繼承這兩個(gè)協(xié)議自定義輸出錯(cuò)誤內(nèi)容躬存。
- 樣例通過(guò)<font color=red>throws</font>關(guān)鍵字拋出異常
- 使用<font color=red>try</font>關(guān)鍵字處理錯(cuò)誤
-1 try张惹?返回一個(gè)可選選類型,這?的結(jié)果就是兩類岭洲,?類是成功诵叁,返回具體的字典值;?類就錯(cuò) 誤钦椭,但是具體哪?類錯(cuò)誤我們不關(guān)系,統(tǒng)?返回了?個(gè)nil
-2 try碑诉!表示你對(duì)這段代碼有絕對(duì)的?信彪腔,這?代碼絕對(duì)不會(huì)發(fā)?錯(cuò)誤! - 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,類的類型快毛,僅類遵守的協(xié)議格嗅。
- Any: 代表任意類型番挺,包括 funcation 類型或者 Optional 類型
- AnyClass 代表任意實(shí)例的類型: AnyObject.Type
- T.self,如果 T是實(shí)例對(duì)象屯掖,返回的就是它本身玄柏; T 是類,那么返回的是 Metadata
- T.Type:?種類型贴铜, T.self 是 T.Type 類型
- type(of:) : ?來(lái)獲取?個(gè)值的動(dòng)態(tài)類型