簡體   English   中英

如何使用字符串數組將結構覆蓋到NSData,反之亦然Swift

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

我有這個結構:

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

我正在嘗試通過執行以下操作將此結構轉換為NSDate:

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

但是,當我嘗試將其轉換回原始結構時:

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

}

我在if let語句上遇到了BAD_ACCESS 問題出在哪兒?

基於以下答案: 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
    }

}

如果按所示創建結構,則可以通過將其編碼為NSData來發送字符串數組,然后在收到時對其進行解碼。

您可以在GitHub上找到完整的工作示例

如果您有更好的解決方案,請留下一些反饋

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM