2016-11-01 71 views
1

我想从主包中的文件加载数据。当我使用此代码无法转换'String?'类型的值到预期的参数类型'URL'

let path = Bundle.main.path(forResource: "abc", ofType: "txt") 
let dataTwo = try! Data(contentsOf: path)\\ error here 

我也试图将字符串转换为URL

let dataTwo = try! Data(contentsOf: URL(string: "file://\(path)")!) 

但执行后正在此

fatal error: unexpectedly found nil while unwrapping an Optional value

+1

您确定您要加载的文件包含在您的包中吗?将它们放在项目文件夹中是不够的,您必须指示Xcode将它们复制到包中。 –

+0

我该死的确定它只在那里。我也检查了生成阶段的复制包资源 –

+1

您可以检入生成的包以查看文件是否真的存在... –

回答

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从一开始,你可以处理错误。在你的具体情况下,你会知道你的资产是否存在,以及你的网址是否正确。

0

对于文件URL中使用init(fileURLWithPath:)构造。

而且,这里

let dataTwo = try! Data(contentsOf: path)\\ error here 

摆脱try!,并使用正确的错误处理,看什么真正的错误发生。

相关问题