我正在尝试从主数据包中的文件加载数据。当我使用这段代码时
let path = Bundle.main.path(forResource: "abc", ofType: "txt")
let dataTwo = try! Data(contentsOf: path)\\ error here
我还尝试将String转换为URL
let dataTwo = try! Data(contentsOf: URL(string: "file://\(path)")!)
但是执行后我得到了这个
致命错误:在解包可选值时意外发现nil
答案 0 :(得分:2)
您可能希望改为使用.url
:
let url = Bundle.main.url(forResource: "abc", withExtension:"txt")
let dataTwo = try! Data(contentsOf: url!)
并安全地处理错误而不是强行解包。
简单版本:
if let url = Bundle.main.url(forResource: "abc", withExtension:"txt"),
let dataTwo = try? Data(contentsOf: url)
{
// use dataTwo
} else {
// some error happened
}
更好:
do {
guard let url = Bundle.main.url(forResource: "abc", withExtension:"txt") else {
return
}
let dataTwo = try Data(contentsOf: url)
// use dataTwo
} catch {
print(error)
}
这样您就不需要将路径转换为URL,因为您从一开始就使用了URL,并且可以处理错误。在您的具体情况下,您将知道您的资产是否存在以及您的网址是否正确。
答案 1 :(得分:0)
对于文件URL,请使用init(fileURLWithPath:)构造函数。
也在这里
let dataTwo = try! Data(contentsOf: path)\\ error here
摆脱try!
并使用正确的错误处理来查看真正的错误发生的原因。