歡迎加入QQ討論群258996829
來(lái)自星星的你 頭像
蘋果3袋
3
來(lái)自星星的你

Swift沒(méi)有異常處理,遇到功能性錯(cuò)誤怎么辦?

發(fā)布時(shí)間:2015-02-16 18:55  回復(fù):0  查看:2546   最后回復(fù):2015-02-16 18:55  

在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)。

這足以去執(zhí)行異步獲取和UI更新。如果需要的話,解析器將記錄或報(bào)告致命的失敗地方。
你甚至可以外包加工大量的數(shù)據(jù)到一個(gè)XPC服務(wù),以及從一開始設(shè)計(jì)異步交互。

如果需要的話,我們甚至可以顯式地處理失敗部分:

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

您還未登錄,請(qǐng)先登錄

熱門帖子

最新帖子

?