【问题标题】:How to convert specific format to any object in swift?如何快速将特定格式转换为任何对象?
【发布时间】:2016-06-03 10:20:31
【问题描述】:

当前格式

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 中。任何人都可以帮助这个

提前致谢。

【问题讨论】:

  • 不是数组的大小或NSStringFromSize() 分别是一个选项吗?
  • 你需要让你的类符合NSCoding。当您这样做时,您将自己编码/解码元组(作为单独的值、作为字符串、作为本身符合NSCoding 的自定义类型等)。 Archives and Serializations Programming Guide 中描述了如何使类符合NSCoding
  • @Rob,我写了 NSCoding 类,我做了所有的事情,比如存储和检索。我想知道如何在这个中分开。或者我可以将整个部分添加到一个数组中并编码/解码你能建议这个吗
  • 我不确定您所说的“在这个中分开”是什么意思。当我做一个类型的NSCoding 时,我也尝试使属性的类型符合。因此,对象对其属性进行编码,并且属性本身将符合并因此可以被编码。当你有一个数组时,如果对象符合,那么数组可以被归档。也许您可以向我们展示(a)您的财产声明,(b)您的encodeWithCoder 实现; (c) 你的init?(coder:) 实现。

标签: ios swift swift2 nskeyedarchiver


【解决方案1】:

要使用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")
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 2017-11-20
    • 2020-10-02
    相关资源
    最近更新 更多