Как я могу прочитать файл на быстрой игровой площадке
Я пытаюсь прочитать текстовый файл с помощью игровой площадки 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)
}
Однако это не с ошибкой. Кажется, первая строка останавливает игровую площадку от вывода чего-либо ниже
Ответы
Ответ 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")
}