Подтвердить что ты не робот

Как я могу прочитать файл на быстрой игровой площадке

Я пытаюсь прочитать текстовый файл с помощью игровой площадки 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)
}

Однако это не с ошибкой. Кажется, первая строка останавливает игровую площадку от вывода чего-либо ниже

4b9b3361

Ответ 1

Это работает для меня. Единственное, что я изменил, - это явно указать имя файла (что подразумевается в вашем примере) - возможно, у вас есть опечатка в неэкранированном определении переменной "файл"?

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...
}

Ответ 2

Вы также можете поместить свой файл в свои игровые площадки. Для этого: покажите 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)

В XCode 7 и Swift 2:

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

В XCode 8 и Swift 3:

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

Если файл имеет двоичные данные, вы можете использовать NSData(contentsOfURL: fileURL!) или Data(contentsOf: fileURL!) (для Swift 3).

Ответ 3

Хотя ответ был поставлен для быстрого исправления, есть лучшее решение.

Каждый раз, когда открывается игровая площадка, ему назначается новый контейнер. Это означает использование обычной структуры каталогов, которую вам нужно будет копировать в новый контейнер каждый раз.

Вместо этого внутри контейнера есть символическая ссылка на каталог данных Shared Playground (/Users//Documents/Shared Playground Data), который остается при повторном открытии игровой площадки и может быть доступен с нескольких игровых площадок.

Вы можете использовать XCPlayground для доступа к этой общей папке.

import XCPlayground

//String Constant
XCPSharedDataDirectoryPath

let filePath = XCPSharedDataDirectoryPath.stringByAppendingPathComponent("<fileName>")

Официальную документацию можно найти здесь: Ссылка на модуль XCPlayground

Прохладный пост о том, как организовать этот каталог на игровой площадке: Swift, игровые площадки и XCPlayground

Ответ 4

Swift 3 (Xcode 8)

Код ниже работает как на игровых площадках iOS, так и на MacOS. Текстовый файл ( "MyText.txt" в этом примере) должен находиться в каталоге Resources игровой площадки. (Примечание. Возможно, вам нужно будет открыть окно навигатора, чтобы увидеть структуру каталогов вашей игровой площадки.)

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.")
}

Ответ 5

1. Доступ к файлу, находящемуся в папке Resources вашей игровой площадки

С Swift 3 Bundle имеет метод url(forResource:withExtension:). url(forResource:withExtension:) имеет следующее объявление:

func url(forResource name: String?, withExtension ext: String?) -> URL?

Возвращает URL-адрес файла для ресурса, указанного указанным именем и расширением файла.


Вы можете использовать url(forResource:withExtension:), чтобы прочитать содержимое json файла, расположенного в папке Resources на iOS или Mac Playground:

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)
}    

Вы можете использовать url(forResource:withExtension:), чтобы прочитать содержимое текстового файла, расположенного в папке Resources на iOS или 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)
}

В качестве альтернативы let image = UIImage(named: "image") вы можете использовать url(forResource:withExtension:) для доступа к изображению, расположенному в папке Resources на игровой площадке iOS:

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)
}

2. Доступ к файлу, который находится в папке ~/Documents/Shared Playground Data вашего компьютера

С Swift 3 модуль PlaygroundSupport предоставляет глобальную константу, называемую playgroundSharedDataDirectory. playgroundSharedDataDirectory имеет следующее объявление:

let playgroundSharedDataDirectory: URL

Путь к каталогу, содержащему данные, разделяемые всеми игровыми площадками.


Вы можете использовать playgroundSharedDataDirectory, чтобы прочитать содержимое json файла, расположенного в папке ~/Documents/Shared Playground Data вашего компьютера, с платформы iOS или Mac:

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)
}

Вы можете использовать playgroundSharedDataDirectory, чтобы прочитать содержимое текстового файла, находящегося в папке ~/Documents/Shared Playground Data вашего компьютера, с платформы iOS или Mac:

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)
}

Вы можете использовать playgroundSharedDataDirectory для доступа к изображению, находящемуся в папке ~/Documents/Shared Playground Data вашего компьютера, с игровой площадки iOS:

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)
}

Ответ 6

  • Выберите файл .playground.

  • Откройте инспектор утилиты. На игровой площадке нажмите opt-cmd-1, чтобы открыть File Inspector. Вы должны увидеть площадку справа. Если вы его не выбрали, нажмите cmd-1, чтобы открыть Навигатор проектов и щелкните файл детской площадки.

  • В разделе "Путь ресурсов" в настройках игровой площадки выберите "Относительно игровой площадки" и платформы как OSX.

Ответ 7

В Mavericks с Xcode 6.0.1 вы также можете читать с помощью платформы iOS.

import UIKit
let dirs : [String]? =    NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true) as? [String]
let myDir = "/Shared Playground Data"

let file = "README.md" // My change to your code - yours is presumably set off-screen
if (dirs != nil) {
  let directories:[String] = dirs!;
  let dir = directories[0] + myDir; // iOS playground documents directory
  let path = dir.stringByAppendingPathComponent(file);

  //read
  let content = String.stringWithContentsOfFile(path, encoding: NSUTF8StringEncoding, error: nil)
  // works...
  println(content!)
}

Помните, что вам нужно создать каталог с именем "Shared Playground Data" в папке "Документы". В моем случае я использовал эту команду: mkdir "/Users/joao_parana/Documents/Shared Playground Data" и поместил туда мой файл README.md

Ответ 8

String.stringWithContentsOfFile DEPRECATED и больше не работает с Xcode 6.1.1

Создайте свой документDirectoryUrl

let documentDirectoryUrl = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).first! as NSURL

Чтобы убедиться, что файл находится там, вы можете использовать команду finder Перейти к папке e copy вставить распечатанный документDirectoryUrl.path there

println(documentDirectoryUrl.path!)
// should look like this: /Users/userName/Library/Containers/com.apple.dt.playground.stub.OSX.PLAYGROUNDFILENAME-5AF5B25D-D0D1-4B51-A297-00015EE97F13/Data/Documents

Просто добавьте имя файла в URL-адрес папки в качестве компонента пути

let fileNameUrl = documentDirectoryUrl.URLByAppendingPathComponent("ReadMe.txt")
var fileOpenError:NSError?

Проверьте, существует ли файл перед тем, как его открыть.

if NSFileManager.defaultManager().fileExistsAtPath(fileNameUrl.path!) {

    if let fileContent = String(contentsOfURL: fileNameUrl, encoding: NSUTF8StringEncoding, error: &fileOpenError) {
        println(fileContent)        // prints ReadMe.txt contents if successful
    } else {
        if let fileOpenError = fileOpenError {
            println(fileOpenError)  // Error Domain=NSCocoaErrorDomain Code=XXX "The file "ReadMe.txt" couldn’t be opened because...."
        }
    }
} else {
    println("file not found")
}