处理init
中可能失败的Swift
的最佳方式是什么?例如,您创建一个依赖于某个可能不可用的资源的类实例。
显然我们有两个选择:
见下文
enum ThingError: ErrorType{
case crap
}
class Thing {
init(c: Int) throws{
if c < 0 {
throw ThingError.crap
}
}
}
var c = try Thing(c: 3)
do{
var d = try Thing(c: -4)
}catch{
print("oh vey!")
}
有推荐的方法吗?第二种选择似乎更“狡猾”......
答案 0 :(得分:6)
既不是天生更好也不是更快。
就个人而言,我发现throws
初始化者是一个巨大的痛苦。我更倾向于初始化程序返回nil
失败,因为我可以使用guard let
进行初始化,而不必在do/catch
中包装内容并处理生成的作用域问题。您的代码说明了问题;你的var d
已被&#34;卡住&#34;在do
范围内。我宁愿这样说:
guard let d = Thing(c:-4) else {return}
// now d is unwrapped and in scope!
...比这(你要说的):
do {
var d = try Thing(c: -4)
} catch {
print("oh vey!")
}
// and here there is no `d`, so _now_ what?
另一方面,抛出错误提供了发送消息的机会,即通信关于确切出错的地方。您只能使用init?
初始化程序来执行此操作;它起作用或失败,并且所有来电者都知道。