Swift初始化程序中的错误

时间:2015-11-18 00:38:59

标签: swift cocoa swift2

处理init中可能失败的Swift的最佳方式是什么?例如,您创建一个依赖于某个可能不可用的资源的类实例。

显然我们有两个选择:

  • 返回nil(可可方式)
  • 的bailable init
  • 抛出错误的init

见下文

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!")
}

有推荐的方法吗?第二种选择似乎更“狡猾”......

1 个答案:

答案 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?初始化程序来执行此操作;它起作用或失败,并且所有来电者都知道。