Search code examples
iosswiftobjectserializationnsdata

ios swift, How to convert 'object to nsdata'


I want to define a c ++ structure as swift code and serialize and deserialize it to write to socket.

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

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

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

I can not find a function to decode and encode uint8, uint32.


Solution

  • Xcode 8 (Swift 3) Playground:

    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