Swift 3:'if let'可选绑定错误

时间:2016-07-04 19:55:30

标签: swift3 xcode8

我在Swift 3中工作,如果让测试:

,我遇到以下问题
let plistUrl = Bundle.main().urlForResource("Books", withExtension: "plist")

if let plistData = try Data(contentsOf: plistUrl!) {
  ...some code
}

编译器在if let语句中显示以下错误:

Initializer for conditional binding must have Optional type, not 'Data'

这里有什么问题,我该如何解决?

2 个答案:

答案 0 :(得分:4)

try不会返回可选项。 try?确实如此。

答案 1 :(得分:0)

使用Swift,可以在“Swift编程语言”的Error Handling部分中解释处理错误和从可能引发错误的方法中检索数据的正确方法。

因此,根据您的需要,您可以选择以下3种模式中的一种来解决您的问题。

1。使用do-catchtry关键字

检索数据并处理错误
  

使用do-catch语句通过运行代码块来处理错误。如果do子句中的代码引发错误,则会将其与catch子句进行匹配,以确定其中哪一个可以处理错误。

用法:

let plistUrl = Bundle.main().urlForResource("Books", withExtension: "plist")!

let plistData: Data?
do {
    plistData = try Data(contentsOf: plistUrl)
} catch {
    print(error as NSError)
    plistData = nil
}

print(plistData)

2。使用try?关键字

检索数据并将错误转换为可选值
  

使用try?通过将错误转换为可选值来处理错误。如果在评估try?表达式时抛出错误,则表达式的值为nil。

用法:

let plistUrl = Bundle.main().urlForResource("Books", withExtension: "plist")!

guard let plistData = try? Data(contentsOf: plistUrl) else {
    return
}

print(plistData)

3。使用try!关键字

检索数据并禁用错误传播
  

有时你知道抛出函数或方法实际上不会在运行时抛出错误。在这种情况下,您可以在表达式之前编写try!以禁用错误传播,并在运行时断言中包装调用,以便不会抛出错误。如果实际抛出了错误,您将收到运行时错误。

用法:

let plistUrl = Bundle.main().urlForResource("Books", withExtension: "plist")!

let plistData = try! Data(contentsOf: plistUrl)

print(plistData)