Как читать файлы текстовых ресурсов игровой площадки с помощью Swift 2 и Xcode 7

Xcode 7 Playgrounds теперь поддерживает загрузку файлов из вложенного Resources каталога.

Я могу получить SKScene(fileNamed: "GameScene"), если у меня GameScene.sks в моем Resources или NSImage(named:"GameScene.png"), если у меня GameScene.png в вашем Resources.

Но как мне также прочитать обычный текстовый файл из каталога Playground Resources?


person Jeremy Chone    schedule 20.06.2015    source источник


Ответы (6)


Мы можем использовать Bundle.main

Итак, если у вас есть test.json на игровой площадке, например

введите описание изображения здесь

Вы можете получить к нему доступ и распечатать его содержимое следующим образом:

// get the file path for the file "test.json" in the playground bundle
let filePath = Bundle.main.path(forResource:"test", ofType: "json")

// get the contentData
let contentData = FileManager.default.contents(atPath: filePath!)

// get the string
let content = String(data:contentData!, encoding:String.Encoding.utf8)

// print
print("filepath: \(filePath!)")

if let c = content {
    print("content: \n\(c)")
}

Напечатаю

filepath: /var/folders/dm/zg6yp6yj7f58khhtmt8ttfq00000gn/T/com.apple.dt.Xcode.pg/applications/Json-7800-6.app/Contents/Resources/test.json
content: 
{
    "name":"jc",
    "company": {
        "name": "Netscape",
        "city": "Mountain View"
    }
}
person Jeremy Chone    schedule 20.06.2015
comment
Здесь стоит упомянуть. Чтобы получить ресурсы, лучший способ - создать игровую площадку внутри WorkSpace. Я появлюсь по умолчанию и в нужном месте. - person jasmo2; 08.07.2016

Ответ Джереми Чона, обновленный для Swift 3, Xcode 8:

// get the file path for the file "test.json" in the playground bundle
let filePath = Bundle.main.path(forResource: "test", ofType: "json")

// get the contentData
let contentData = FileManager.default.contents(atPath: filePath!)

// get the string
let content = String(data: contentData!, encoding: .utf8)


// print
print("filepath: \(filePath!)")

if let c = content {
    print("content: \n\(c)")
}
person leanne    schedule 13.12.2016
comment
filePath следует использовать безопасно. Пожалуйста, проверьте, не является ли filePath равным нулю, например, используя let. То же самое нужно сделать с contentData. Код должен быть написан так, чтобы он мог справиться с этими проблемными случаями. - person Heitara; 24.03.2017

Вы можете использовать String напрямую с URL-адресом. Пример в Swift 3:

let url = Bundle.main.url(forResource: "test", withExtension: "json")!
let text = String(contentsOf: url)
person Damiaan Dufaux    schedule 02.02.2017

Swift 5

Можно получить доступ к файлам в вашей Resources папке с помощью пакета в Playground.

import UIKit

Вот два способа получить данные JSON.

Дорожка:

    guard let path = Bundle.main.path(forResource:"test", ofType: "json"),
    let data = FileManager.default.contents(atPath: path) else {
        fatalError("Can not get json data")
    }

URL:

    guard let url = Bundle.main.url(forResource:"test", withExtension: "json") else {
            fatalError("Can not get json file")
    }
    if let data = try? Data(contentsOf: url) {
        // do something with data
    }
person skymook    schedule 21.08.2019

Еще один короткий способ (Swift 3):

let filePath = Bundle.main.path(forResource: "test", ofType: "json")
let content: String = String(contentsOfFile: filePath!, encoding: .utf8)
person Yoav Aharoni    schedule 07.03.2017

Добавлена ​​попытка для swift3.1:

let url = Bundle.main.url(forResource: "test", withExtension: "json")!
// let text = String(contentsOf: url)
do {
    let text = try String(contentsOf: url)
    print("text: \n\(text)")
}
catch _ {
    // Error handling
}

// --------------------------------------------------------------------
let filePath2 = Bundle.main.path(forResource: "test", ofType: "json")
do {
    let content2: String = try String(contentsOfFile: filePath2!, encoding: .utf8)
    print("content2: \n\(content2)")

}
catch _ {
    // Error handling
}
person user8416808    schedule 04.08.2017
comment
Игнорировать ошибки в блоке catch - очень плохая практика. Вы не должны использовать оператор _: просто укажите catch, и он правильно сгенерирует переменную error в блоке. - person Eric Aya; 04.08.2017