2016-09-20 90 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