在swift,iOS游乐场中读取文件

alt*_*tag 12 xcode ios swift swift-playground

在搜索了许多(很多!)快速游乐场问题甚至制作这些代码后,我仍然在苦苦挣扎.

我已经将一个文本文件放在Resources包内容的文件夹中,它在playground(/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's no error
if let theError = error {
    print("\(theError.localizedDescription)")
} else {
    print("No error")
}
Run Code Online (Sandbox Code Playgroud)

问题是,content在操场输出中显示为Some "apple\ngame\nhow\nswift\ntoken",而不是预期的文件内容.

它正在查找文件,因为如果我更改文件名,则会出错.有关获取文件内容的任何建议吗?

Xcode 6.1

编辑: 所以,实际问题是我没想到操场输出(包括,println)被转义.结合疲劳和其他愚蠢行为,让我相信存在问题,如果不存在的话.

有趣的是,并非一切似乎都在操场上逃脱:

println("foo\nbar")    // Outputs "foo\nbar", escaped
println("\\n")         // Outputs "\n", unescaped
Run Code Online (Sandbox Code Playgroud)

Leo*_*bus 11

您可以尝试创建一个用于打开和保存文件的类:

更新: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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法: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") } 
Run Code Online (Sandbox Code Playgroud)

用法:File.open

if let loadedData = File.open("\(NSHomeDirectory())/Desktop/file.txt") {
    print(loadedData)
} else {
    println("error reading file")
 }  
Run Code Online (Sandbox Code Playgroud)

如果您更喜欢使用URLs(就像我做的那样并且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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Ste*_*erg 6

我已经看到使用TextEdit从.rtf文件创建的.txt文件的这个问题.

我使用类似的代码在我的游乐场的resources文件夹中加载了一个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)
Run Code Online (Sandbox Code Playgroud)

输出是:

{\ rtf1\ansi\ansicpg1252\cocoartf1343\cocoasubrtf140 {\ fonttbl\f0\fswiss\fcharset0 Helvetica;} {\ colortbl;\red255\green255\blue255;}\margl1440\margr1440\vieww10800\viewh8400\viewkind0\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural

\ f0\fs24\cf0你好那里}

所以"你好那里"是嵌入式的.这是.rtf文件中所有布局信息的问题.

我回到TextEdit并创建了一个真正的.txt文件.打开文件后 - 格式化|制作纯文本

现在这个相同的代码给控制台输出"你好那里".

希望这可以帮助.