web-dev-qa-db-ja.com

Swift、iOSプレイグラウンドでファイルを読み取る

多くの(多くの!)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
_
13
alttag

ファイルを開いて保存するためのクラスを作成してみてください。

更新: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")
 }  

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
        }
    }
}
11
Leo Dabus

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ファイルを作成しました。ファイルを開いた後-フォーマット|プレーンテキストにする

この同じコードで、コンソール出力に「こんにちは」が表示されました。

6
Steve Rosenberg