2016-06-03 8 views
0

Aktuelles FormatWie konvertiert man ein bestimmtes Format in ein Objekt in swift?

Optional(posterPrint.Frame(name: "RIBBA", productNumber: "303.016.24", productSize: (63.0, 93.0), pictureSize: (61.0, 91.0), pictureWithMatSize: (50.0, 70.0), frameColor: [UIDeviceRGBColorSpace 0.92549 0.92549 0.92549 1], matColor: [UIDeviceRGBColorSpace 0.92549 0.92549 0.92549 1])) 

Ich möchte diesen zu array hinzufügen und jedes Objekt zu konvertieren. Ich habe viel versucht, dies in NSkeyedArchiver gespeichert. Ich lese irgendwo Tupel sind nicht möglich, in NSKeyedArchiever zu speichern. Jeder Hilfe in diesem

Vielen Dank im Voraus.

+0

Isn 't ein Array für die Größen oder 'NSStringFromSize()' bzw. eine Option? – vadian

+1

Sie müssen Ihre Klasse an "NSCoding" anpassen. Und wenn Sie das tun, würden Sie die Tupel selbst codieren/dekodieren (als separate Werte, als String, als benutzerdefinierten Typ, der selbst mit "NSCoding" übereinstimmt, usw.). Wie man eine Klasse mit "NSCoding" konform macht, ist im [Archives and Serializations Programming Guide] (https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Archiving/Archiving.html) beschrieben. – Rob

+0

@Rob, ich schrieb NSCoding Klasse und ich habe alles wie Speichern und Abrufen. Ich möchte wissen, wie man sich in diesem trennt. oder kann ich ganzen Teil zu einem Array hinzufügen und kodieren/decodieren könnten Sie dies vorschlagen – kumar

Antwort

0

Um NSKeyedArchiver zu verwenden, machen Sie Ihr Objekt konform zu NSCoding. Und wenn Sie Tupel haben, können Sie die Elemente separat kodieren/dekodieren:

class MyObject: NSObject, NSCoding { 
    var id: Int 
    var size: (Float, Float) 

    init(id: Int, size: (Float, Float)) { 
     self.id = id 
     self.size = size 

     super.init() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     guard let id = aDecoder.decodeObjectForKey("id") as? Int else { return nil } 
     guard let size0 = aDecoder.decodeObjectForKey("size.0") as? Float else { return nil } 
     guard let size1 = aDecoder.decodeObjectForKey("size.1") as? Float else { return nil } 

     self.id = id 
     self.size = (size0, size1) 

     super.init() 
    } 

    func encodeWithCoder(aCoder: NSCoder) { 
     aCoder.encodeObject(id, forKey: "id") 
     aCoder.encodeObject(size.0, forKey: "size.0") 
     aCoder.encodeObject(size.1, forKey: "size.1") 
    } 
} 

Sie Arrays erwähnen, also bin ich nicht sicher, ob Sie über ein Array der benutzerdefinierten Objekte sprechen, aber jetzt, dass Ihr Objekt konform zu NSCoding, können Sie nun Arrays dieser Objekte ohne weiteren Aufwand archivieren und entpacken.


Ebenso, wenn Sie ein anderes Objekt haben, die eine MyObject Eigenschaft hat, können Sie NSCoding auf das anwenden, und es können die Vorteile aus der Tatsache ziehen, dass MyObject bereits entspricht NSCoding:

class ParentObject: NSObject, NSCoding { 
    var name: String 
    var value: Int 
    var child: MyObject 

    init(name: String, value: Int, child: MyObject) { 
     self.name = name 
     self.value = value 
     self.child = child 

     super.init() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     name = aDecoder.decodeObjectForKey("name") as! String 
     value = aDecoder.decodeObjectForKey("value") as! Int 
     child = aDecoder.decodeObjectForKey("child") as! MyObject 

     super.init() 
    } 

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