通过搜索许多(很多!)快速的游乐场问题来搜索这个代码,我仍然在苦苦挣扎。
我已将文本文件放在包内容的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
答案 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文件。打开文件后 - 格式化|制作纯文本
现在这个相同的代码给控制台输出“你好那里”。
希望这有帮助。