2015-03-08 44 views
8

使用NSCoding可以存储元组吗?我有一个像((UInt8, UInt8), (UInt8, UInt8))的元组。但aCoder.encodeObject(myTuple)不起作用。我是否必须将元组转换为NSData或者这是绝对不可能的?感谢您的帮助使用NSCoding的Swift编码元组

回答

5

元组不能编码,因为它不是一个类,但一种方法是分别对一个元组的每个组件进行编码,然后在解码时解码每个组件,然后将元组的值设置为一个元组从解码的内容构建。

class ViewController: UIViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     let obj = SomeClass() 
     obj.foo = (6,5) 

     let data = NSKeyedArchiver.archivedDataWithRootObject(obj) 
     NSUserDefaults.standardUserDefaults().setObject(data, forKey: "books") 

     if let data = NSUserDefaults.standardUserDefaults().objectForKey("books") as? NSData { 
      let o = NSKeyedUnarchiver.unarchiveObjectWithData(data) as SomeClass 
      println(o.foo) // (Optional(6), Optional(5)) 

     } 
    } 
} 

class SomeClass: NSObject, NSCoding { 
    var foo: (x: Int?, y: Int?)! 

    required convenience init(coder decoder: NSCoder) { 
     self.init() 
     let x = decoder.decodeObjectForKey("myTupleX") as Int? 
     let y = decoder.decodeObjectForKey("myTupleY") as Int? 
     foo = (x,y) 
    } 

    func encodeWithCoder(coder: NSCoder) { 
     coder.encodeObject(foo.x, forKey: "myTupleX") 
     coder.encodeObject(foo.y, forKey: "myTupleY") 
    } 
} 
0

我想和大家分享我的代码,它具有基于伊恩的代码一些更新。 我用我的创建元素的类别/子类别的列表。

class catSubcatOption: NSObject, NSCoding { 

var element: (x: String, y: String)! 

override init() { 

} 

public func encode(with aCoder: NSCoder) { 
    aCoder.encode(element.category, forKey: "category") 
    aCoder.encode(element.subcategory, forKey: "subcategory") 
} 

required init(coder decoder: NSCoder) { 
    let category = decoder.decodeObject(forKey: "category") as! String 
    let subcategory = decoder.decodeObject(forKey:"subcategory") as! String 
    element = (category,subcategory) 
} }