简体   繁体   English

如何使用字符串数组将结构覆盖到NSData,反之亦然Swift

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

I have this struct: 我有这个结构:

struct MessageRandomWords {
        let message = MessageType.kMessageTypeRandomWords
        let randomWords : Array<Array<String>>
    }

I'm trying to convert this struct to NSDate by doing this: 我正在尝试通过执行以下操作将此结构转换为NSDate:

    var message = MessageRandomWords(randomWords: self.words)
    let data = NSData(bytes: &message, length: sizeof(MessageRandomWords))

But when i'm trying to convert this back to the original struct: 但是,当我尝试将其转换回原始结构时:

var messageRandomWords : MessageRandomWords?
                data.getBytes(&messageRandomWords, length: sizeof(MessageRandomWords))
                if let messageRandomWords = messageRandomWords {

}

I got a BAD_ACCESS erro on the if let statement. 我在if let语句上遇到了BAD_ACCESS Where is the problem? 问题出在哪儿?

Based on this answer: Swift structs to NSData and back I wrote this solution: 基于以下答案: Swift构造为NSData,然后我写了这个解决方案:

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. 如果按所示创建结构,则可以通过将其编码为NSData来发送字符串数组,然后在收到时对其进行解码。

You can find the full working example on GitHub 您可以在GitHub上找到完整的工作示例

If you have some better solutions please leave some feedback 如果您有更好的解决方案,请留下一些反馈

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM