Прочитайте файл в быстрой, игровой площадке iOS
Просматривая многие (многие!) быстрые вопросы на детской площадке, чтобы обработать этот код, я все еще боюсь.
Я поместил текстовый файл в папку Resources
содержимого пакета, и он отображается как псевдоним (ссылка) в текущих файлах temp, созданных игровой площадкой (/var/folders/ ...
).
import UIKit
let bundle = NSBundle.mainBundle()
let myFilePath = bundle.pathForResource("dict1", ofType: "txt")
println(myFilePath) // <-- this is correct, there is a shortcut to the Resource file at this location
var error:NSError?
var content = String(contentsOfFile:myFilePath!, encoding:NSUTF8StringEncoding, error: &error)
println(content!) // <-- this is *NOT* the file contents [EDIT: see later note]
// Demonstrate there no error
if let theError = error {
print("\(theError.localizedDescription)")
} else {
print("No error")
}
Проблема заключается в том, что content
отображается на выходе игровой площадки как Some "apple\ngame\nhow\nswift\ntoken"
, а не на содержимое файла, как ожидалось.
Он находит файл, потому что, если я изменю имя файла, это ошибки. Любые советы по получению содержимого файла?
Xcode 6.1
EDIT:
Итак, фактическая проблема заключалась в том, что я не ожидал выхода игровой площадки (в том числе, println
). Это, в сочетании с усталостью и другими глупостями, заставило меня поверить, что была проблема, когда никого не было.
Интересно, что на детской площадке не все ускользает:
println("foo\nbar") // Outputs "foo\nbar", escaped
println("\\n") // Outputs "\n", unescaped
Ответы
Ответ 1
Вы можете попробовать создать класс для открытия и сохранения ваших файлов:
обновление: Xcode 10 • Swift 4.2
class File {
class func open(_ path: String, encoding: String.Encoding = .utf8) -> String? {
if FileManager.default.fileExists(atPath: path) {
do {
return try String(contentsOfFile: path, encoding: encoding)
} catch {
print(error)
return nil
}
}
return nil
}
class func save(_ path: String, _ content: String, encoding: String.Encoding = .utf8) -> Bool {
do {
try content.write(toFile: path, atomically: true, encoding: encoding)
return true
} catch {
print(error)
return false
}
}
}
использование: File.save
let stringToSave: String = "Your text"
let didSave = File.save("\(NSHomeDirectory())/Desktop/file.txt", stringToSave)
if didSave { print("file saved") } else { print("error saving file") }
использование: File.open
if let loadedData = File.open("\(NSHomeDirectory())/Desktop/file.txt") {
print(loadedData)
} else {
println("error reading file")
}
Если вы предпочитаете работать с URL
(как я рекомендую Apple):
Обратите внимание,, что в Swift 4 класс URL
уже существует.
class Url {
class func open(url: URL) -> String? {
do {
return try String(contentsOf: url, encoding: String.Encoding.utf8)
} catch {
print(error)
return nil
}
}
class func save(url: URL, fileContent: String) -> Bool {
do {
try fileContent.write(to: url, atomically: true, encoding: .utf8)
return true
} catch {
print(error)
return false
}
}
}
Ответ 2
Я видел эту проблему с файлами .txt, созданными из файлов .rtf с помощью TextEdit.
Я загрузил файл text.txt в папку ресурсов моей игровой площадки, используя похожий код для вас. Содержимое файла было "привет там" и было сделано путем преобразования файла .rtf в .txt путем изменения расширения.
let path = NSBundle.mainBundle().pathForResource("text", ofType: "txt")//or rtf for an rtf file
var text = String(contentsOfFile: path!, encoding: NSUTF8StringEncoding, error: nil)!
println(text)
Результат был:
{\ Rtf1\ANSI\ansicpg1252\cocoartf1343\cocoasubrtf140
{\ fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\ Colortbl;\red255\green255\blue255;}
\ Margl1440\margr1440\vieww10800\viewh8400\viewkind0
\ Пард \tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural
\ f0\fs24\cf0 привет там}
Таким образом, "привет там" встроен. Это проблема со всей информацией макета в файле .rtf.
Я вернулся к TextEdit и создал настоящий файл .txt. После открытия файла - Формат | Сделать обычный текст
Теперь этот же код дал консольный вывод "Привет!"