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

时间:2014-10-23 22:12:50

标签: ios xcode swift swift-playground

通过搜索许多(很多!)快速的游乐场问题来搜索这个代码,我仍然在苦苦挣扎。

我已将文本文件放在包内容的Resources文件夹中,它在操场(/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")
}

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

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

Xcode 6.1

修改 所以,实际的问题是我不希望转义操场输出(包括println)。结合疲劳和其他愚蠢行为,让我相信在没有问题时会出现问题。

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

println("foo\nbar")    // Outputs "foo\nbar", escaped
println("\\n")         // Outputs "\n", unescaped

2 个答案:

答案 0 :(得分: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
        }
    }
}

用法: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
        }
    }
}

答案 1 :(得分:6)

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

我使用类似的代码在我的游乐场的resources文件夹中加载了一个text.txt文件。文件内容是“hello there”,是通过更改扩展名将.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 \ PARD \ tx720 \ tx1440 \ tx2160 \ tx2880 \ tx3600 \ tx4320 \ tx5040 \ tx5760 \ tx6480 \ tx7200 \ tx7920 \ tx8640 \ pardirnatural

\ f0 \ fs24 \ cf0你好}

因此嵌入了“你好”。这是.rtf文件中所有布局信息的问题。

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

现在这个相同的代码给控制台输出“你好那里”。

希望这有帮助。