测试经过测试 | ✓ |
语言语言 | SwiftSwift |
许可 | MIT |
发布最后发布 | 2017年9月 |
SwiftSwift 版本 | 3.2 |
SPM支持 SPM | ✗ |
由 Dan Thorpe 维护。
ValueCoding 是一组简单的协议,用于支持 Swift 值类型的编码。
它通过允许值类型(必须符合 ValueCoding
协议)通过 typealias 定义其 编码器 来工作。编码器是另一种实现 CoderType
协议的类型。此类型通常是一个 NSObject
,它实现了 NSCoding
并且是一个适配器,负责编码和解码值属性。
下面是一个简单的 struct
的最小示例
import ValueCoding
struct Foo: ValueCoding {
typealias Coder = FooCoder
let bar: String
}
class FooCoder: NSObject, NSCoding, CodingType {
enum Keys: String {
case Bar = "bar"
}
let value: Foo
required init(_ v: Foo) {
value = v
}
required init?(coder aDecoder: NSCoder) {
let bar = aDecoder.decodeObjectForKey(Keys.Bar.rawValue) as? String
value = Foo(bar: bar!)
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(value.bar, forKey: Keys.Bar.rawValue)
}
}
如果您正在将现有的从类到值类型进行转换,则 NSCoding
方法应该很熟悉,并且您可能能够复用现有的代码。
框架为符合 ValueCoding
且具有有效编码器的类型提供了静态方法和属性。因此,给定一个 Foo
的值,您可以使用 NSKeyedArchiver
编码它以准备存档。
let data = NSKeyedArchiver.archivedDataWithRootObject(foo.encoded)
同样,可以从未存档的解码中执行
if let foo = Foo.decode(NSKeyedUnarchiver.unarchiveObjectWithData(data)) {
// etc, decode returns optionals when working with a single item.
}
这些方法也可以用于在需要编码的其它类型中组合值类型。
当与值序列一起工作时分,请使用序列上 encoded
属性。
let foos = Set(arrayLiteral: Foo(), Foo(), Foo())
let data = NSKeyedArchiver.archivedDataWithRootObject(foos.encoded)
在将 NSArray
正确解码之前,请先对它执行一个条件铸造到 [AnyObject]
。结果将是一个空的 Array<Foo>
,如果对象无法成功转换,则长度将小于原始编码数组。此外,任何无法解码的 [AnyObject]
成员都将从结果中过滤掉。这意味着如果解码出现问题,则结果的长度将小于原始编码数组。
let foos = Foo.decode(NSKeyedUnarchiver.unarchiveObjectWithData(data) as? [AnyObject])
Money 框架包含了更多实现 ValueCoding
的例子,包括泛型类型 FXTransactionCoder
。
YapDatabaseExtensions 框架大量依赖于 ValueCoding
。有关泛型约束的更多示例,请参阅其 功能 API。
ValueCoding 为跨平台(iOS、OS X、watchOS、tvOS)扩展兼容框架构建。它还通过 CocoaPods 可用。
pod 'ValueCoding'