在Swift中沒(méi)有異常處理或拋出,如果不能像Java一樣使用異??刂屏鹘Y(jié)構(gòu),那當(dāng)你編寫庫(kù)的代碼執(zhí)行了一個(gè)失敗的子程序,且發(fā)現(xiàn)解析可選類型(Unwrapping Optionals)太麻煩時(shí),你打算怎么做?我所遵循的一直是想要保持Swift代碼的干凈整潔,所以都盡可能的避免對(duì)可選類型(Optionals)的使用,同時(shí)還要維護(hù)它們傳達(dá)錯(cuò)誤操作的目的。
最近,Colin Eberhardt指出不拋出異常會(huì)讓嵌套解析條件(Unwrapping Conditionals)的代碼變得雜亂:
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!") }
不過(guò)似乎有一種替代的方法我們可以嘗試:使用閉包形式的回調(diào)函數(shù)。
在Return語(yǔ)句中使用回調(diào)取代可選類型
可選類型會(huì)讓你的代碼變得雜亂,如:
let maybeResult: JSONData? = JSONParser.parse(aJSONString) if let result = maybeResult { // ... }
調(diào)用方需要管理被調(diào)用函數(shù)功能的結(jié)果,它需要知道被調(diào)用函數(shù)對(duì)某些擴(kuò)展所做的事情。Optionals使用很簡(jiǎn)單,但你代碼中仍會(huì)顯示解析可選類型留下的復(fù)雜的痕跡。
考慮East-Oriented代碼的原則:如果一個(gè)函數(shù)返回一個(gè)值,定義信息是向西傳播。若它發(fā)送的是一個(gè)信息時(shí),是向東傳播。一個(gè)Optional返回值是向西傳播信息,而且也正因?yàn)樗且粋€(gè)Optional ,較之普通的返回值要更復(fù)雜。因?yàn)樗谝粋€(gè)調(diào)用中有兩種情況。如果是嵌套調(diào)用和嵌套的if語(yǔ)句則會(huì)更糟糕。
讓我們轉(zhuǎn)移注意力到被調(diào)用函數(shù)工作的失敗部分。
JSONParser.parse(aJSONString) { data: JSONData in // ... }
現(xiàn)在parse()需要考慮失敗處理,只有一切運(yùn)行順暢時(shí),它才會(huì)進(jìn)行調(diào)用實(shí)現(xiàn)成功關(guān)閉。反之,調(diào)用方不會(huì)采取行動(dòng)。
如果需要的話,我們甚至可以顯式地處理失敗部分:
JSONParser.parse(aJSONString, success: { data: JSONData in // ... }, failure: { error: NSError in NSLog("An error occured while parsing: \(error.description)") })
以NSAsynchronousFetchRequest為例:它有一個(gè)完成的代碼塊,如果請(qǐng)求失敗,將不會(huì)被調(diào)用。Cocoa API也開始越來(lái)越多的使用代碼塊。所以,你可以嘗試使用這種方法,也許能夠改善你應(yīng)用的控制流。
文章來(lái)源:christiantietze