コードをSwift 3に移行すると、do/try/catchブロックで同じ警告が多数表示されます。割り当てがnilを返さないかどうかを確認し、それが機能しない場合はコンソールに何かを出力します。 catchブロックは、「doブロックでエラーがスローされないため、到達不能です」と言います。 1つのcatchブロックですべてのエラーをキャッチしたいと思います。
let xmlString: String?
do{
//Warning for line below: "no calls to throwing function occurs within 'try' expression
try xmlString = String(contentsOfURL: accessURL, encoding: String.Encoding.utf8)
var xmlDict = XMLDictionaryParser.sharedInstance().dictionary(with: xmlString)
if let models = xmlDict?["Cygnet"] {
self.cygnets = models as! NSArray
}
//Warning for line below: "catch block is unreachable because no errors are thrown in 'do' block
} catch {
print("error getting xml string")
}
割り当てエラーを処理する適切なtry catchブロックを作成するにはどうすればよいですか?
できる方法の1つは、nilの検出時に独自のエラーをスローすることです。
この種の独自のエラーがあると:
enum MyError: Error {
case FoundNil(String)
}
このようなものを書くことができます:
do{
let xmlString = try String(contentsOf: accessURL, encoding: String.Encoding.utf8)
guard let xmlDict = XMLDictionaryParser.sharedInstance().dictionary(with: xmlString) else {
throw MyError.FoundNil("xmlDict")
}
guard let models = xmlDict["Cygnet"] as? NSArray else {
throw MyError.FoundNil("models")
}
self.cygnets = models
} catch {
print("error getting xml string: \(error)")
}