【问题标题】:ios swift, How to convert 'object to nsdata'ios swift,如何将“对象转换为 nsdata”
【发布时间】:2017-05-12 15:15:06
【问题描述】:

我想将 c++ 结构定义为 swift 代码并对其进行序列化和反序列化以写入套接字。

class PacketHeader: NSObject, NSCoding {
    var ver: UInt8 = 0
    var len: UInt32 = 0

    required init(coder aDecoder: NSCoder) {
        ??
    }

    func encode(with aCoder: NSCoder) {
        ??
    }
}

我找不到对 uint8、uint32 进行解码和编码的函数。

【问题讨论】:

  • 为什么不用它作为对象呢?我的意思是说把它转换成 NSNumber,检查一下。还有一个选项 open func decodeInt32(forKey key: String) -> Int32 open func decodeInt64(forKey key: String) -> Int64

标签: ios swift object serialization nsdata


【解决方案1】:

Xcode 8 (Swift 3) 游乐场:

class PacketHeader: NSObject, NSCoding {
    var ver: UInt8 = 0
    var len: UInt32 = 0

    override init() {
        super.init()
    }

    required init(coder aDecoder: NSCoder) {

        if let ver = aDecoder.decodeObject(forKey: "ver") as? NSNumber {
            self.ver = ver.uint8Value
        }

        if let len = aDecoder.decodeObject(forKey: "len") as? NSNumber {
            self.len = len.uint32Value
        }

    }

    func encode(with aCoder: NSCoder) {
        aCoder.encode(NSNumber(value: ver), forKey: "ver")
        aCoder.encode(NSNumber(value: len), forKey: "len")
    }

}

let data = PacketHeader()
data.ver = 10
data.len = 8

let savedData = NSKeyedArchiver.archivedData(withRootObject: data)
let obj = NSKeyedUnarchiver.unarchiveObject(with: savedData) as? PacketHeader
obj?.ver
obj?.len

【讨论】:

    【解决方案2】:

    如果您不想转换为NSNumber,请执行以下操作,尽管我怀疑这一定是一个重复的问题:

    class PacketHeader: NSObject, NSCoding {
        var ver: UInt8 = 0
        var len: UInt32 = 0
    
        init(ver: UInt8, len: UInt32) {
            self.ver = ver
            self.len = len
            super.init()
        }
    
        required init(coder aDecoder: NSCoder) {
            self.ver = UInt8(aDecoder.decodeCInt(forKey: "ver"))
            self.len = UInt32(aDecoder.decodeCInt(forKey: "len"))
        }
    
        func encode(with aCoder: NSCoder) {
            aCoder.encodeCInt(Int32(self.ver), forKey: "ver")
            aCoder.encodeCInt(Int32(self.len), forKey: "len")
        }
    }
    
    let x = PacketHeader(ver: 75, len: 123)
    let e = NSKeyedArchiver.archivedData(withRootObject: x)
    if let y = NSKeyedUnarchiver.unarchiveObject(with: e) as? PacketHeader {
        print("\(y.ver), \(y.len)") // 75, 123
    } else {
        print("URK???")
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-11
      • 2017-08-04
      • 1970-01-01
      • 1970-01-01
      • 2015-01-06
      • 2015-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多