Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在Swift中将结构序列化为NSData_Ios_Swift_Swift2 - Fatal编程技术网

Ios 在Swift中将结构序列化为NSData

Ios 在Swift中将结构序列化为NSData,ios,swift,swift2,Ios,Swift,Swift2,我需要将Swift结构保存到NSData。我无法遵守NSCoding,因为它只适用于NSObject的子类 我在Swift 2.0中编写了一个带有扩展的小协议,它似乎在操场上工作。这似乎有点太容易了 这里有什么我遗漏的吗 以下代码可以在Xcode 7 Beta 5中的操场上运行 //: Playground - noun: a place where people can play import UIKit protocol Serializable { init?(encode

我需要将Swift结构保存到
NSData
。我无法遵守
NSCoding
,因为它只适用于
NSObject
的子类

我在Swift 2.0中编写了一个带有扩展的小
协议
,它似乎在操场上工作。这似乎有点太容易了

这里有什么我遗漏的吗

以下代码可以在Xcode 7 Beta 5中的操场上运行

//: 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的序列化解决方案。与其发明自己的协议,不如看看RawRepresentable。它比您在这里所做的更通用,因为它与NSData无关。只要您的类型在RawValue类型别名中指定,就可以序列化为任何内容。

另一种解决方案是将数据序列化为JSON。我刚刚创建了一个使这更简单的方法,它应该适用于结构、枚举和类。要使用它,您需要实现
ToJSON
FromJSON
协议。然后,要序列化和反序列化数据,可以使用
Aeson.encode
Aeson.decode
功能

我编写了一个框架,用Swift序列化结构、类和枚举,尽管它序列化为plist文件(仅为方便起见,可以是任何格式)

高级别说明:

  • 序列化到中间字符串:通过协议扩展提供
    toDictionary()
    方法来表示任何对象。你不需要做任何事情来支持这方面的事情
  • 通过泛型反序列化,每个类型都应该有一个init(本质上)提供有关其属性的类型信息

这里有一个,还有一个。

我感觉这样做行不通,如果您将数据写入文件,请重新启动应用程序并尝试读取文件,因为我认为您只是在存储对内存的引用,而不是内存本身。我目前正在寻找一个解决方案。这可能在理论上回答了这个问题,但最好在这里为将来的用户提供答案的基本部分,并提供链接供参考。可以通过以下方式变得无效。