ValueCoding 3.0.0

ValueCoding 3.0.0

测试经过测试
语言语言 SwiftSwift
许可 MIT
发布最后发布2017年9月
SwiftSwift 版本3.2
SPM支持 SPM

Dan Thorpe 维护。



Build status

ValueCoding

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])

CoderType 示例

Money 框架包含了更多实现 ValueCoding 的例子,包括泛型类型 FXTransactionCoder

YapDatabaseExtensions 框架大量依赖于 ValueCoding。有关泛型约束的更多示例,请参阅其 功能 API

安装

ValueCoding 为跨平台(iOS、OS X、watchOS、tvOS)扩展兼容框架构建。它还通过 CocoaPods 可用。

pod 'ValueCoding'