2014-11-29 11 views
11

Istnieją ograniczenia związane z pisaniem NSDictionaries do plików w szybkim tempie. Na podstawie tego, czego nauczyłem się od api docs i this stackoverflow answer, typami kluczy powinny być NSString, a typy wartości również powinny być typu NSx, a Int, String i inne typy swift mogą nie działać. Pytanie jest takie, że jeśli mam słownik taki jak: Dictionary<Int, Dictionary<Int, MyOwnType>>, w jaki sposób mogę go napisać/odczytać z/do pliku plist w swift?Zapisywanie szybkiego słownika do pliku

Odpowiedz

21

W każdym razie, jeśli chcesz zapisać MyOwnType do pliku, MyOwnType musi być podklasą NSObject i jest zgodny z protokołem NSCoding. tak:

class MyOwnType: NSObject, NSCoding { 

    var name: String 

    init(name: String) { 
     self.name = name 
    } 

    required init(coder aDecoder: NSCoder) { 
     name = aDecoder.decodeObjectForKey("name") as? String ?? "" 
    } 

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

Następnie tutaj jest Dictionary:

var dict = [Int : [Int : MyOwnType]]() 
dict[1] = [ 
    1: MyOwnType(name: "foobar"), 
    2: MyOwnType(name: "bazqux") 
] 

Więc tutaj jest Twoje pytanie:

Pisanie szybki słownika do pliku

Można użyj NSKeyedArchiver do napisania, a NSKeyedUnarchiver, aby przeczytać:

func getFileURL(fileName: String) -> NSURL { 
    let manager = NSFileManager.defaultManager() 
    let dirURL = manager.URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false, error: nil) 
    return dirURL!.URLByAppendingPathComponent(fileName) 
} 

let filePath = getFileURL("data.dat").path! 

// write to file 
NSKeyedArchiver.archiveRootObject(dict, toFile: filePath) 

// read from file 
let dict2 = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as [Int : [Int : MyOwnType]] 

// here `dict2` is a copy of `dict` 

Ale w ciele zapytanie:

Jak mogę pisać/czytać go do/z plist pliku w systemie SWIFT?

W rzeczywistości NSKeyedArchiverformat is binary plist. Ale jeśli chcesz tego słownika jako wartość plist można szeregować Dictionary do NSData z NSKeyedArchiver:

// archive to data 
let dat:NSData = NSKeyedArchiver.archivedDataWithRootObject(dict) 

// unarchive from data 
let dict2 = NSKeyedUnarchiver.unarchiveObjectWithData(data) as [Int : [Int : MyOwnType]] 
+0

Bardzo dziękuję za szczegółową i wielką odpowiedź. Jestem nowy w szybkim i iOS dev i pomógł mi zrozumieć powiązane rzeczy :) – AKH

+0

to pisze wiele podmiotów do plist –