如何使用字符串数组将结构覆盖到NSData,反之亦然Swift [英] How to Covert struct with an Array of string to NSData and vice versa Swift
本文介绍了如何使用字符串数组将结构覆盖到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屋!
查看全文