多くの(多くの!)Swift遊び場の質問thisのコードを作成する)を検索しても、まだ苦労しています。
テキストファイルをパッケージコンテンツの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
EDIT:したがって、actual問題は、プレイグラウンドの出力(println
を含む)がエスケープされることを期待していなかったことでした。それは、疲労や他の愚かさと相まって、何も存在しないときに問題があると私に思わせました。
興味深いことに、すべてが遊び場でエスケープされているわけではありません。
_println("foo\nbar") // Outputs "foo\nbar", escaped
println("\\n") // Outputs "\n", unescaped
_
ファイルを開いて保存するためのクラスを作成してみてください。
更新: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
sでの作業を希望する場合(私が行っており、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
}
}
}
TextEditを使用して.rtfファイルから作成された.txtファイルでこの問題が発生しました。
同様のコードを使用して、プレイグラウンドのリソースフォルダーに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\pard\t720 tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\pardirnatural
\ f0\fs24\cf0こんにちは}
「こんにちは」が埋め込まれています。これは、.rtfファイル内のすべてのレイアウト情報に関する問題です。
TextEditに戻り、真の.txtファイルを作成しました。ファイルを開いた後-フォーマット|プレーンテキストにする
この同じコードで、コンソール出力に「こんにちは」が表示されました。