AnyObject (大多数)
类型 | 描述 |
---|---|
Class | 支持,自动推断类型,部分类型需要实现Serializeable 或Codeable |
Enum | 支持,需要实现Serializeable 或Codeable |
Struct | 支持,需要实现Serializeable 或Codeable |
Tuple | 不支持,无法序列化和反序列化(临时类型),无法映射(NSArray,NSDictionary) |
Optional | 支持,自动推断元素 |
Collection | 支持,自动推断元素 |
Dictionary | 支持,自动推断键值类型 |
Set | 支持,自动推断元素(映射为数组) |
Cocoapods Podfile
platform :ios, '8.0'
pod "swift-serialize"
use_frameworks!
let e1 = Example()
e1.val_int = 123
e1.val_bool = true
e1.val_double = 456.0
e1.val_string = "hello swift"
e1.val_array = [7, 8, 9]
e1.val_dictionary = [10 : 11, 12 : 13, 14 : 15]
// serialize
let json = serialize(e1)
let jsonData = try! Serialize.serializeToJSONData(e1)
let jsonString = try! Serialize.serializeToJSONString(e1)
print(jsonData!.length)
print(jsonString!)
// deserialize
let e2: Example? = Serialize.deserialize(json!)
let e3: Example? = Serialize.deserialize(json!, Example.self) as? Example
print(e1 == e2)
print(e2 == e3)
Codeable
Codeable
需要实现 setValue:forSerialize:
和 valueForSerialize:
方法.
Buildable
仅在反序列化时使用,如果您不需要反序列化,可以跳过。
序列化:直接获取成员,因此没有调用 valueForSerialize:
,此函数为保留函数。
反序列化:将使用 setValue:forSerialize:
,需在方法中对每个成员进行更新,可以使用 assign
简化类型转换的代码。
class Example : Buildable, Codeable {
var a: Optional<Int> = nil
var b: Optional<String> = nil
var c: Optional<Array<Int>> = nil
var u1: Optional<NSURL> = nil
var u2: Optional<NSURL> = nil
required init() {}
func valueForSerialize(key: String) -> Any? {
return nil
}
func setValue(value: Any?, forSerialize key: String) {
switch key {
case "a": assign(&a, value)
case "b": assign(&b, value)
case "c": assign(&c, value)
default: break
}
}
}
Serializeable
Serializeable
需要实现 serialize
和 deserialize:
方法。
class Example : Serializeable {
var a: Optional<Int> = nil
var b: Optional<String> = nil
var c: Optional<Array<Int>> = nil
var u1: Optional<NSURL> = nil
var u2: Optional<NSURL> = nil
required init() {}
func serialize() -> AnyObject? {
let dic = NSMutableDictionary()
if let o = a.serialize() {
dic["a"] = o
}
if let o = b.serialize() {
dic["b"] = o
}
if let o = c.serialize() {
dic["c"] = o
}
return dic.count != 0 ? dic : nil
}
static func deserialize(o: AnyObject) -> Self? {
// 只处理NSDictionary的
guard let dic = o as? NSDictionary where dic.count != 0 else {
return nil
}
var tmp = self.init()
if let v = Optional<Int>.deserialize(dic["a"] ?? NSNull()) {
tmp.a = v
}
if let v = Optional<String>.deserialize(dic["b"] ?? NSNull()) {
tmp.b = v
}
if let v = Optional<Array<Int>>.deserialize(dic["c"] ?? NSNull()) {
tmp.c = v
}
return tmp
}
}
NSObject
NSObject
仅使用 Serializeable
,因为它已经实现了 serialize
和 deserialize:
。
大部分情况下可以直接使用系统的 KVC (NSKeyValueCoding),但也有一些情况无法使用系统的 KVC。
您可以使用 @objc
来检查是否原生支持,对于那些不支持的情况,您需要实现 Codeable
class Example : NSObject, Codeable {
// base type
var val_int: Int = 0
var val_bool: Bool = false
var val_double: Double = 0
var val_string: String?
var val_array: [Int] = []
var val_dictionary: [Int:Int] = [:]
// 原生KVC不支持的类型
var val_int_t: Int?
var val_bool_t: Bool?
var val_doulbe_t: Double?
var val_array_t: [Int?]?
var val_dictionary_t: [Int:Int?]
// custom type
var val_custom: Custom?
var val_custom_array: [Custom]?
var val_custom_dictionary: [String:Custom]?
class Custom : NSObject {
var val: Example?
}
func valueForSerialize(key: String) -> Any? {
return nil
}
func setValue(value: Any?, forSerialize key: String) {
switch key {
case "val_int_t": assign(&val_int_t, value)
case "val_bool_t": assign(&val_doulbe_t, value)
case "val_array_t": assign(&val_array_t, value)
case "val_dictionary_t": assign(&val_dictionary_t, value)
default: break
}
}
}
类型 | 描述 |
---|---|
enum | 除了 @objc enum E : Int ,其他都不支持 |
tuple | 所有都不支持 |
struct | 所有都不支持 |
class | 除了继承自 NSObject 的自定义类外,都不支持 |
optional | 大部分支持,需要使用 @objc 来检查 |