如何使用字符串数组将结构覆盖到NSData,反之亦然Swift [英] How to Covert struct with an Array of string to NSData and vice versa Swift

查看:65
本文介绍了如何使用字符串数组将结构覆盖到NSData,反之亦然Swift的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有这个结构:

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

我正在尝试通过执行以下操作将此结构转换为NSDate:

I'm trying to convert this struct to NSDate by doing this:

    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 {

}

我在if let语句上遇到了 BAD_ACCESS 错误.问题出在哪里?

I got a BAD_ACCESS erro on the if let statement. Where is the problem?

推荐答案

基于此答案:将结构快速转换为NSData并返回我写了这个解决方案:

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
    }

}

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

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.

您可以在 GitHub

如果您有更好的解决方案,请留下一些反馈意见

If you have some better solutions please leave some feedback

这篇关于如何使用字符串数组将结构覆盖到NSData,反之亦然Swift的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆