2016-06-03 4 views
0

Текущий форматКак преобразовать конкретный формат в любой объект в 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])) 

Я хочу, чтобы добавить этот к array и преобразовывать любой объект. Я пробовал много в этом, чтобы сохранить его в NSkeyedArchiver. Я читал, что кортежи не могут храниться в NSKeyedArchiever. Помощь в этом

Заранее спасибо.

+0

ISN 't массив для размеров или 'NSStringFromSize()' соответственно вариант? – vadian

+1

Вам нужно сделать соответствие класса 'NSCoding'. И когда вы это делаете, вы сами кодируете/декодируете кортежи (как отдельные значения, как строку, как пользовательский тип, который сам соответствует «NSCoding» и т. Д.). Как сделать соответствие класса «NSCoding» описано в [Руководстве по программированию и сериализации] (https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Archiving/Archiving.html). – Rob

+0

@Rob, я написал класс NSCoding, и я сделал все как хранение и извлечение. Я хочу знать, как разделить в этом. или я могу добавить целую часть к одному массиву и кодировать/декодировать, вы можете предложить это – kumar

ответ

0

Чтобы использовать NSKeyedArchiver, вы делаете свой объект соответствующим NSCoding. И если у вас есть кортежи, вы можете кодировать/декодировать элементы отдельно:

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") 
    } 
} 

Вы упоминаете массивы, так что я не уверен, что если вы говорите о массиве пользовательских объектов, но теперь, когда ваш объект соответствует NSCoding, теперь вы можете без проблем архивировать и распаковывать массивы этих объектов.


Точно так же, если у вас есть какой-то другой объект, который имеет MyObject свойство, вы можете применить NSCoding на этот вопрос, и он может воспользоваться тем, что MyObject уже соответствует 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") 
    } 
}