摘要:在Swift中沒有異常處理或拋出,當你編寫庫的代碼執(zhí)行了一個失敗的子程序,且解析可選類型太麻煩時,你打算怎么做?文章作者所遵循的思想一直是想要保持Swift代碼的干凈整潔,所以都盡可能的避免對可選類型的使用。
在Swift中沒有異常處理或拋出,如果不能像Java一樣使用異常控制流結(jié)構(gòu),那當你編寫庫的代碼執(zhí)行了一個失敗的子程序,且發(fā)現(xiàn)解析可選類型(Unwrapping Optionals)太麻煩時,你打算怎么做?我所遵循的一直是想要保持Swift代碼的干凈整潔,所以都盡可能的避免對可選類型(Optionals)的使用,同時還要維護它們傳達錯誤操作的目的。
近,Colin Eberhardt指出不拋出異常會讓嵌套解析條件(Unwrapping Conditionals)的代碼變得雜亂:
[cpp] view plaincopy在CODE上查看代碼片派生到我的代碼片
if let a = a {
if let b = b {
if let c = c {
println("\(a) - \(b) - \(c)")
} else {
println("Something was nil!")
}
} else {
println("Something was nil!")
}
} else {
println("Something was nil!")
}
不過似乎有一種替代的方法我們可以嘗試:使用閉包形式的回調(diào)函數(shù)。
在Return語句中使用回調(diào)取代可選類型
可選類型會讓你的代碼變得雜亂,如:
[cpp] view plaincopy在CODE上查看代碼片派生到我的代碼片
let maybeResult: JSONData? = JSONParser.parse(aJSONString)
if let result = maybeResult {
// ...
}
調(diào)用方需要管理被調(diào)用函數(shù)功能的結(jié)果,它需要知道被調(diào)用函數(shù)對某些擴展所做的事情。Optionals使用很簡單,但你代碼中仍會顯示解析可選類型留下的復雜的痕跡。
考慮East-Oriented代碼的原則:如果一個函數(shù)返回一個值,定義信息是向西傳播。若它發(fā)送的是一個信息時,是向東傳播。一個Optional返回值是向西傳播信息,而且也正因為它是一個Optional ,較之普通的返回值要更復雜。因為它在一個調(diào)用中有兩種情況。如果是嵌套調(diào)用和嵌套的if語句則會更糟糕。
讓我們轉(zhuǎn)移注意力到被調(diào)用函數(shù)工作的失敗部分。
[cpp] view plaincopy在CODE上查看代碼片派生到我的代碼片
JSONParser.parse(aJSONString) { data: JSONData in
// ...
}
現(xiàn)在parse()需要考慮失敗處理,只有一切運行順暢時,它才會進行調(diào)用實現(xiàn)成功關(guān)閉。反之,調(diào)用方不會采取行動。
這足以去執(zhí)行異步獲取和UI更新。如果需要的話,解析器將記錄或報告致命的失敗地方。你甚至可以外包加工大量的數(shù)據(jù)到一個XPC服務(wù),以及從一開始設(shè)計異步交互。
如果需要的話,我們甚至可以顯式地處理失敗部分:
[cpp] view plaincopy在CODE上查看代碼片派生到我的代碼片
JSONParser.parse(aJSONString, success: {
data: JSONData in
// ...
}, failure: {
error: NSError in
NSLog("An error occured while parsing: \(error.description)")
})
以NSAsynchronousFetchRequest為例:它有一個完成的代碼塊,如果請求失敗,將不會被調(diào)用。Cocoa API也開始越來越多的使用代碼塊。所以,你可以嘗試使用這種方法,也許能夠改善你應用的控制流。
文章來源:christiantietze
本站文章版權(quán)歸原作者及原出處所有 。內(nèi)容為作者個人觀點, 并不代表本站贊同其觀點和對其真實性負責,本站只提供參考并不構(gòu)成任何投資及應用建議。本站是一個個人學習交流的平臺,網(wǎng)站上部分文章為轉(zhuǎn)載,并不用于任何商業(yè)目的,我們已經(jīng)盡可能的對作者和來源進行了通告,但是能力有限或疏忽,造成漏登,請及時聯(lián)系我們,我們將根據(jù)著作權(quán)人的要求,立即更正或者刪除有關(guān)內(nèi)容。本站擁有對此聲明的最終解釋權(quán)。