ios - 在 Swift 中将结构序列化为 NSData

标签 ios swift swift2

我需要将 Swift 结构保存到 NSData。我不符合 NSCoding,因为它只适用于 NSObject 的子类。

我在 Swift 2.0 中写了一个带有扩展的小协议(protocol),它似乎可以在 Playground 中工作。这似乎有点容易了。

这里有什么我想念的吗?

以下代码可以在 Xcode 7 Beta 5 的 playground 中运行。

//: Playground - noun: a place where people can play

 import UIKit


protocol Serializable {
    init?(encodedData: NSData)
    var encodedData: NSData { get }
}

extension Serializable {

    var encodedData: NSData {
        var pointer = self
        return NSData(bytes: &pointer, length: sizeof(Self.self))
    }

    init?(encodedData data: NSData) {
        guard
            data.length == sizeof(Self.self)
            else { return nil }

        self = UnsafePointer(data.bytes).memory
    }
}

struct Test: CustomStringConvertible, Serializable {
    let message: String
    let people: [String]
    let color: UIColor

    var description: String {
        return "\(message) + \(people) + \(color)"
    }
}

let structToEncode = Test(message: "Hi!", people: ["me", "someone else"], color: UIColor(red: 0.5, green: 0.2, blue: 0.1, alpha: 0.4))
let encodedData = structToEncode.encodedData
let decodedStruct = Test(encodedData: encodedData)

最佳答案

我也一直在寻找 Swift 的序列化解决方案。与其发明自己的协议(protocol),不如看看 RawRepresentable。它比您在这里所做的更通用,因为它不依赖于 NSData。只要您的类型在 RawValue 类型别名中指定,您就可以序列化为任何内容。

关于ios - 在 Swift 中将结构序列化为 NSData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31881151/

相关文章:

ios - 如何从 TableView 中删除特定数据

ios - 在NSString中的句号或问号前修剪空格

ios - AWS S3 iOS 开发工具包 : How to resume upload after connection is interrupted?

ios - 异步调用的空闭包

ios - 以编程方式在彼此下方添加 subview

swift - 在 Swift 2 中删除通知观察者的正确位置在哪里?

ios native 应用程序允许从网络保存数据吗?

ios - 如何根据滑出菜单导航到不同的 View Controller

ios - 通用 UITableViewCell 标识符

NSURLSession - 垃圾数据结束(WatchOS)