我在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'
这里有什么问题,我该怎么解决呢?
发布于 2016-07-04 19:57:04
try
不返回可选内容。try?
有。
发布于 2016-07-06 09:52:42
有了Swift,处理错误和从可能抛出错误的方法中检索数据的正确方法将在"Swift编程语言“的错误处理部分中解释。
因此,根据您的需要,您可以选择以下三种模式中的一种来解决您的问题。
1.使用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)
2.使用try?
关键字检索数据并将错误转换为可选值
通过将错误转换为可选值,可以使用
try?
来处理错误。如果在计算try?
表达式时抛出错误,则表达式的值为零。
用法:
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)
https://stackoverflow.com/questions/38191472
复制相似问题