我在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'
这里有什么问题,我该如何解决?
答案 0 :(得分:4)
try
不会返回可选项。 try?
确实如此。
答案 1 :(得分:0)
使用Swift,可以在“Swift编程语言”的Error Handling部分中解释处理错误和从可能引发错误的方法中检索数据的正确方法。
因此,根据您的需要,您可以选择以下3种模式中的一种来解决您的问题。
do-catch
和try
关键字使用
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)
try?
关键字使用
try?
通过将错误转换为可选值来处理错误。如果在评估try?
表达式时抛出错误,则表达式的值为nil。
用法:
let plistUrl = Bundle.main().urlForResource("Books", withExtension: "plist")!
guard let plistData = try? Data(contentsOf: plistUrl) else {
return
}
print(plistData)
try!
关键字有时你知道抛出函数或方法实际上不会在运行时抛出错误。在这种情况下,您可以在表达式之前编写
try!
以禁用错误传播,并在运行时断言中包装调用,以便不会抛出错误。如果实际抛出了错误,您将收到运行时错误。
用法:
let plistUrl = Bundle.main().urlForResource("Books", withExtension: "plist")!
let plistData = try! Data(contentsOf: plistUrl)
print(plistData)