Прочитайте файл в быстрой, игровой площадке 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. После открытия файла - Формат | Сделать обычный текст

Теперь этот же код дал консольный вывод "Привет!"