【问题标题】:Call can throw, but errors cannot be thrown out of a property initializer调用可以抛出,但不能从属性初始化器中抛出错误
【发布时间】:2015-12-23 23:05:16
【问题描述】:

更新到Swift 2.0后,在调用NSFielManager时,出现如下错误。你能告诉我是什么问题吗?

let cachesDirectoryURL = NSFileManager().URLForDirectory(.CachesDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: true)

错误:

"调用可以抛出,但不能从属性中抛出错误 初始化器”

【问题讨论】:

标签: ios swift swift2 nsfilemanager


【解决方案1】:

这意味着我们必须捕获可能抛出的错误,以防出现问题:

do
{
    let cachesDirectoryURL = try NSFileManager().URLForDirectory(.CachesDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: true)
}
catch let error as NSError
{
    print(error.localizedDescription)
}

【讨论】:

  • 这仍然会从 property 初始化程序中“抛出错误” - 否则在上下文中无效。在这种情况下,let 指的是一个成员,如消息所示,而不是本地绑定。
  • 它必须是 1) 一个属性,并且; 2) 在 Swift 2 下重现 OPs 行为。此代码在 property 声明的上下文中毫无意义。
  • @Unheilig swiftstub.com/601877219 - 报告错误的上下文错误。如果您可以证明这适用于在 do.. 中创建的 property
  • 首先,我不生气。其次,我之所以投反对票,正是因为 provided example 不同意这个答案。如果提供了代码的反例(或更正)来显示该案例(并且创建了 property),我将反转反对票,因为它会被证明是不正确的。 “有效”但没有正确解决问题的答案仍然是错误的;这个答案不是我唯一反对的答案,即使它“有效”。
  • 我没有“猛烈抨击”。没有必要把它变成个人的。我花时间提供一个反例。只要它存在,我就不能接受这样一个有效的答案,“有效”与否。
【解决方案2】:

如果您在类中将其声明为全局,则需要添加前缀“try!”重视你所分配的。

喜欢这个

let cachesDirectoryURL = try! NSFileManager().URLForDirectory(.CachesDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: true)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 2013-04-25
    相关资源
    最近更新 更多