2016-11-01 66 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!,並使用正確的錯誤處理,看什麼真正的錯誤發生。

相關問題