2016-06-06 6 views
1

mit writeToURL schreiben ich mit dem Text in der Front ein Karten-Array habe und zurück. jetzt möchte ich diese daten in einer csv-datei speichern, die ich erstellt und zu meinem projekt hinzugefügt habe. Der folgende Code erstellt das Zeichenfolgenarray durch ein Komma getrennt und versucht dann, es in die Datei zu schreiben. Aber die Datei bleibt leer. Im Code werden keine Fehler angezeigt. Irgendeine Idee, was ich hier falsch mache?Ich mag eine Zeichenfolge in einer lokalen Datei in schnellen

+0

Fang die Ausnahme und drucken, um zu sehen, was geschieht. –

+1

@ILikeTau - Du hast Recht, aber technisch, sind Sie den Fehler zu kontrollieren, nicht eine „Ausnahme“. – Rob

+1

Gibt es einen Grund, warum Sie diese als CSV benötigen? Ich würde CSV nur verwenden, wenn ich diese CSV mit einer anderen App austauschen müsste. Es gibt bessere Formate, wenn Ihre Absicht ist es, dieses Array zu speichern und später von der gleichen App geladen wurde zurück (zum Beispiel eines 'NSKeyedArchiver'). – Rob

Antwort

3

Es werden keine Fehler angezeigt, weil Sie den Fehler erkennen und nichts tun. In print(error) im catch Block:

do { 
    try cardRow.writeToURL(NSURL(fileURLWithPath: path!), atomically: false, encoding: NSUTF8StringEncoding) 
} 
catch { 
    print(error) 
} 

Das Problem ist, dass Sie in eine Datei in dem Bündel zu schreiben sind versucht, aber das Bündel ist schreibgeschützt. Sie sollten versuchen, in den Ordner Dokumente zu schreiben:

let fileURL = try! NSFileManager.defaultManager().URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false) 
    .URLByAppendingPathComponent("cardsFile.csv") 

By the way, writeToFile wird die Ausgabedatei ersetzen. Wenn Sie in eine Datei Daten schreiben möchten, Daten anhängen, wie Sie gehen entlang, können Sie NSOutputStream verwenden:

let fileURL = try! NSFileManager.defaultManager().URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false).URLByAppendingPathComponent("cardsFile.csv") 

guard let stream = NSOutputStream(URL: fileURL, append: false) else { 
    print("unable to open file") 
    return 
} 

stream.open() 

for card in cards { 
    let data = "\(card.front),\(card.back)\n".dataUsingEncoding(NSUTF8StringEncoding)! 
    guard stream.write(UnsafePointer<UInt8>(data.bytes), maxLength: data.length) > 0 else { 
     print("unable to write to file") 
     break 
    } 
} 

stream.close() 

Wenn das Ziel ist das lokal nur zu retten, würde ich nicht verwenden CSV-Format Ich würde stattdessen ein natives Format verwenden, z. B. NSKeyedArchiver. Also, zuerst machen Card zum NSCoding Protokoll entsprechen, das von init?(coder:) und encodeWithCoder() Umsetzung:

class Card: NSObject, NSCoding { 
    let front: String 
    let back: String 

    init(front: String, back: String) { 
     self.front = front 
     self.back = back 
     super.init() 
    } 

    required convenience init?(coder aDecoder: NSCoder) { 
     guard let front = aDecoder.decodeObjectForKey("front") as? String else { return nil } 
     guard let back = aDecoder.decodeObjectForKey("back") as? String else { return nil } 
     self.init(front: front, back: back) 
    } 

    func encodeWithCoder(aCoder: NSCoder) { 
     aCoder.encodeObject(front, forKey: "front") 
     aCoder.encodeObject(back, forKey: "back") 
    } 

    override var description: String { get { return "<Card front=\(front); back=\(back)>" } } 
} 

Dann, wenn Sie speichern möchten:

let fileURL = try! NSFileManager.defaultManager().URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false) 
    .URLByAppendingPathComponent("cardsFile.bplist") 

if !NSKeyedArchiver.archiveRootObject(cards, toFile: fileURL.path!) { 
    print("error saving archive") 
} 

Und wenn Sie wollen, dass es aus der Datei lesen:

guard let cards2 = NSKeyedUnarchiver.unarchiveObjectWithFile(fileURL.path!) as? [Card] else { 
    print("problem reading archive") 
    return 
} 

print(cards2) 
+0

dank Rob bekam ich die NSOutputStream Version zu arbeiten. Ich brauchte eine Weile, um das DocumentsDirectory und die Datei zu finden, aber jetzt weiß ich das auch. Es ist schwer ein Anfänger zu sein! – kangarooChris