[英]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.