2016-09-20 83 views
0

在發佈這個相當簡單的問題之前,我花了至少2個小時嘗試。以下代碼在json文件位於應用程序包內時有效。Swift從應用程序包以外的文件中讀取json

 if let file = Bundle.main.url(forResource: "data", withExtension: "json") {.... 

我讀JSON文件這樣...

let myData = try Data(contentsOf: file as URL) 

我無法從「/庫/ Application Support/AppFolder/data.json訪問文件的相同副本」。

下不起作用

let filepath = "/Library/Application Support/AppFolder/data.json" 
    if let file = NSURL(string: filepath) {... 

回答

1

除了它的建議檢索特定的系統文件夾使用一個專用的API,在文件系統中的URL必須始終以NSURL(fileURLWithPath...)創建一個事實:

let applicationSupportFolderURL = try! NSFileManager.defaultManager().URLForDirectory(.ApplicationSupportDirectory, 
                   inDomain: .LocalDomainMask, 
                 appropriateForURL: nil, 
                   create: false) 
let jsonDataURL = applicationSupportFolderURL.URLByAppendingPathComponent("AppFolder/data.json") 

或斯威夫特3(這是相當短得多)

let applicationSupportFolderURL = try! FileManager.default.url(for: .applicationSupportDirectory, 
                   in: .localDomainMask, 
                appropriateFor: nil, 
                  create: false) 
let jsonDataURL = applicationSupportFolderURL.appendingPathComponent("AppFolder/data.json") 
+0

我不得不更新語法以符合swift 3。然後我得到一個錯誤「類型URL的值沒有成員URLbyAppendingPathComponent。」 – nyitguy

+0

我更新了添加Swift 3版本的答案。 – vadian

+0

這很好,但我怎麼能指向目錄「/Volumes/VolumeName/data.json」? – nyitguy

0

嘗試:NSURL.init(fileURLWithPath: "your_path")

string:產生表示字符串給出一個NSURL。所以像「http://www.google.com」這樣的字符串和URL代表http://www.google.com

fileURLWithPath:需要一個路徑而不是URL,並生成一個表示使用file:// URL的路徑的NSURL。所以如果你給它/foo/bar/baz的URL將代表file:///foo/bar/baz