How to Covert struct with an Array of string to NSData and vice versa Swift

前端 未结 1 594
鱼传尺愫
鱼传尺愫 2021-01-27 15:29

I have this struct:

struct MessageRandomWords {
        let message = MessageType.kMessageTypeRandomWords
        let randomWords : Array&         


        
相关标签:
1条回答
  • 2021-01-27 15:59

    Based on this answer: Swift structs to NSData and back I wrote this solution:

    struct MessageRandomWords {
        let message = MessageType.kMessageTypeRandomWords
        var data : NSData?
        var name: String
    
        struct ArchivedPacket {
            let message = MessageType.kMessageTypeRandomWords
            var dataLength : Int64
            var nameLength : Int64
        }
    
        func archive() -> NSData {
            var archivedPack = ArchivedPacket(dataLength: Int64(self.data!.length), nameLength: Int64(self.name.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)))
            var metaData = NSData(bytes: &archivedPack, length: sizeof(ArchivedPacket))
            let archiveData = NSMutableData(data: metaData)
             archiveData.appendData(name.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!)
            archiveData.appendData(data!)
            return archiveData
        }
    
        static func unarchive(data : NSData!) -> MessageRandomWords {
            var archivedPacket = ArchivedPacket(dataLength: 0, nameLength: 0)
            let archivedStructLength = sizeof(ArchivedPacket) //lenght of the struct
    
            //Get the data tha will form our archived Packet
            let archivedData = data.subdataWithRange(NSMakeRange(0, archivedStructLength))
            //save the data taht form the archivedPacket inside the archivedPacket
            archivedData.getBytes(&archivedPacket, length: archivedStructLength)
            //get the range of data that contains the name
            let nameRange = NSMakeRange(archivedStructLength, Int(archivedPacket.nameLength))
            //get the range of the data that contains the data
            let dataRange = NSMakeRange(archivedStructLength + Int(archivedPacket.nameLength), Int(archivedPacket.dataLength))
            //get the data that rappresent the name
            let nameData = data.subdataWithRange(nameRange)
            //Get the name frome the data
            let name = NSString(data: nameData, encoding: NSUTF8StringEncoding) as! String
            // Geth the data
            let theData = data.subdataWithRange(dataRange)
    
            //Create the struct
            let messageRndm = MessageRandomWords(data: theData, name: name)
            return messageRndm
        }
    
    }
    

    If you create the struct as showed, you can send your array of string by encode it as NSData and then decode it when received.

    You can find the full working example on GitHub

    If you have some better solutions please leave some feedback

    0 讨论(0)
提交回复
热议问题