如何在快捷的游乐场中阅读文件

Gre*_*reg 37 swift

我试图使用Swift操场阅读文本文件,如下所示

let dirs : String[]? =    NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true) as? String[]

if (dirs != nil) {
    let directories:String[] = dirs!;
    let dir = directories[0]; //documents directory
    let path = dir.stringByAppendingPathComponent(file);

    //read
    let content = String.stringWithContentsOfFile(path, encoding: NSUTF8StringEncoding, error: nil)
}
Run Code Online (Sandbox Code Playgroud)

然而,这失败了没有错误.似乎第一行阻止操场输出下面的任何东西

kns*_*shn 63

您还可以将文件放入游乐场的资源中.为此:显示Project Navigator CMD + 1.将文件拖放到资源文件夹中.然后阅读文件:

在XCode 6.4和Swift 1.2上:

var error: NSError?
let fileURL = NSBundle.mainBundle().URLForResource("Input", withExtension: "txt")
let content = String(contentsOfURL: fileURL!, encoding: NSUTF8StringEncoding, error: &error)
Run Code Online (Sandbox Code Playgroud)

在XCode 7和Swift 2上:

let fileURL = NSBundle.mainBundle().URLForResource("Input", withExtension: "txt")
let content = try String(contentsOfURL: fileURL!, encoding: NSUTF8StringEncoding)
Run Code Online (Sandbox Code Playgroud)

在XCode 8和Swift 3上:

let fileURL = Bundle.main.url(forResource: "Input", withExtension: "txt")
let content = try String(contentsOf: fileURL!, encoding: String.Encoding.utf8)
Run Code Online (Sandbox Code Playgroud)

如果文件包含二进制数据,则可以使用NSData(contentsOfURL: fileURL!)Data(contentsOf: fileURL!)(对于Swift 3).


mde*_*itt 36

虽然提供了快速解决方案的答案,但有一个更好的解决方案.

每次打开游乐场时,都会为其分配一个新容器.这意味着使用普通的目录结构,您每次都必须将所需的文件复制到新容器中.

相反,在容器内部有一个指向共享游乐场数据目录(/用户//文档/共享游乐场数据)的符号链接,该目录在重新打开游乐场时仍然存在,并且可以从多个游乐场访问.

您可以使用XCPlayground访问此共享文件夹.

import XCPlayground

let path = XCPlaygroundSharedDataDirectoryURL.appendingPathComponent("foo.txt")
Run Code Online (Sandbox Code Playgroud)

官方文档可以在这里找到:XCPlayground模块参考

关于如何组织每个操场的这个目录的酷帖:Swift,Playgrounds和XCPlayground

  • 很棒的答案,很棒的解决方案!我不得不创建`〜/ Documents/Shared Plaground Data`,但之后全部按预期工作.谢谢! (5认同)
  • 不推荐使用`XCPSharedDataDirectoryPath`.它建议使用`XCPlaygroundSharedDataDirectoryURL`. (2认同)
  • “对于 swift 4.2 使用 playgroundSharedDataDirectory。不需要导入任何东西”——你需要导入 PlaygroundSupport (Swift 5 / Xcode 10.2) (2认同)

Ima*_*tit 20

1.访问位于ResourcesPlayground文件夹中的文件

使用Swift 3,Bundle有一个叫做的方法url(forResource:withExtension:).url(forResource:withExtension:)有以下声明:

func url(forResource name: String?, withExtension ext: String?) -> URL?
Run Code Online (Sandbox Code Playgroud)

返回由指定名称和文件扩展名标识的资源的文件URL.


您可以使用url(forResource:withExtension:)它来读取位于ResourcesiOS或Mac Playground文件夹中的json文件的内容:

import Foundation

do {
    guard let fileUrl = Bundle.main.url(forResource: "Data", withExtension: "json") else { fatalError() }
    let data = try Data(contentsOf: fileUrl)
    let json = try JSONSerialization.jsonObject(with: data, options: [])
    print(json)
} catch {
    print(error)
}    
Run Code Online (Sandbox Code Playgroud)

您可以使用url(forResource:withExtension:)它来读取位于ResourcesiOS或Mac Playground文件夹中的文本文件的内容:

import Foundation

do {
    guard let fileUrl = Bundle.main.url(forResource: "Text", withExtension: "txt") else { fatalError() }
    let text = try String(contentsOf: fileUrl, encoding: String.Encoding.utf8)
    print(text)
} catch {
    print(error)
}
Run Code Online (Sandbox Code Playgroud)

作为替代方案let image = UIImage(named: "image"),您可以使用url(forResource:withExtension:)以访问位于ResourcesiOS Playground文件夹中的图像:

import UIKit

do {
    guard let fileUrl = Bundle.main.url(forResource: "Image", withExtension: "png") else { fatalError() }
    let data = try Data(contentsOf: fileUrl)
    let image = UIImage(data: data)
} catch {
    print(error)
}
Run Code Online (Sandbox Code Playgroud)

2.访问位于~/Documents/Shared Playground Data计算机文件夹中的文件

使用Swift 3,PlaygroundSupport模块提供了一个名为的全局常量playgroundSharedDataDirectory.playgroundSharedDataDirectory有以下声明:

let playgroundSharedDataDirectory: URL
Run Code Online (Sandbox Code Playgroud)

包含所有操场之间共享数据的目录的路径.


您可以使用playgroundSharedDataDirectory~/Documents/Shared Playground Data从iOS或Mac Playground 读取位于计算机文件夹中的json文件的内容:

import Foundation
import PlaygroundSupport

do {
    let fileUrl = PlaygroundSupport.playgroundSharedDataDirectory.appendingPathComponent("Data.json")        
    let data = try Data(contentsOf: fileUrl)
    let json = try JSONSerialization.jsonObject(with: data, options: [])
    print(json)
} catch {
    print(error)
}
Run Code Online (Sandbox Code Playgroud)

您可以使用playgroundSharedDataDirectory~/Documents/Shared Playground Data从iOS或Mac Playground 读取位于计算机文件夹中的文本文件的内容:

import Foundation
import PlaygroundSupport

do {
    let fileUrl = PlaygroundSupport.playgroundSharedDataDirectory.appendingPathComponent("Text.txt")
    let text = try String(contentsOf: fileUrl, encoding: String.Encoding.utf8)
    print(text)
} catch {
    print(error)
}
Run Code Online (Sandbox Code Playgroud)

您可以使用playgroundSharedDataDirectory~/Documents/Shared Playground Data从iOS Playground 访问位于计算机文件夹中的图像:

import UIKit
import PlaygroundSupport

do {
    let fileUrl = PlaygroundSupport.playgroundSharedDataDirectory.appendingPathComponent("Image.png")
    let data = try Data(contentsOf: fileUrl)
    let image = UIImage(data: data)
} catch {
    print(error)
}
Run Code Online (Sandbox Code Playgroud)


Vin*_*van 11

Swift 3(Xcode 8)

以下代码适用于iOS和macOS游乐场.文本文件(本例中为"MyText.txt")必须位于Resourcesplayground 的目录中. (注意:您可能需要打开导航窗口才能看到游乐场的目录结构.)

import Foundation

if let fileURL = Bundle.main.url(forResource:"MyText", withExtension: "txt")
{
    do {
        let contents = try String(contentsOf: fileURL, encoding: String.Encoding.utf8)
        print(contents)
    } catch {
        print("Error: \(error.localizedDescription)")
    }
} else {
    print("No such file URL.")
}
Run Code Online (Sandbox Code Playgroud)


Gri*_*mxn 5

这适合我.我唯一改变的是明确文件名(在你的例子中暗示) - 也许你在"文件"变量的屏幕外定义中有一个拼写错误?

let dirs = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true) as? [String]

let file = "trial.txt" // My change to your code - yours is presumably set off-screen
if let directories = dirs {
  let dir = directories[0]; //documents directory
  let path = dir.stringByAppendingPathComponent(file);

  //read
  let content = NSString(contentsOfFile: path, usedEncoding: nil, error: nil)
  // works...
}
Run Code Online (Sandbox Code Playgroud)

更新Swift 4.2

正如@raistlin指出的那样,现在就是这样

let dirs = NSSearchPathForDirectoriesInDomains(
              FileManager.SearchPathDirectory.documentDirectory,
              FileManager.SearchPathDomainMask.userDomainMask,
              true)
Run Code Online (Sandbox Code Playgroud)

或者,更简洁地说:

let dirs = NSSearchPathForDirectoriesInDomains(.documentDirectory,
                                .userDomainMask, true)
Run Code Online (Sandbox Code Playgroud)