Swift通用对象/ JSON序列化

Ste*_*ich 6 generics serialization swift

tl; dr您是否可以使用符合协议的初始化方法一般地实例化对象,同时还保留对象的预期类型?我现在正在尝试的是seg faulting编译器.


在我正在编写的库中,我正在尝试使用Swift有限的内省功能来实现一般化序列化/反序列化对象的目标.

以下是使用反射设置变量值的全局函数的代码.如果找到字典,它会尝试协调嵌套构造:

func model__setValue<T where T: NSObject, T: Serializable>(value: AnyObject, forSerializationKey key: String, model m: T) {
    let varNames = object__getVarNames(mirror: reflect(m)) // Gets a list of this object's variable names
    if let i = find(m.serializationKeys, key) {
        if value is [String : AnyObject] {
            // This allows us to have nested dictionary representations
            // of Serializable constructs and have them init properly
            let t1 = reflect(m)[i].1.valueType as NSObject.Type
            if t1 is Serializable.Type {
                let t2 = t1 as Serializable.Type
                let finalObj = t2(dictionary: value as [String : AnyObject]) // Segmentation fault: 11
                m.setValue(finalObj, forKey: varNames[i])
            }
        } else {
            m.setValue(value, forKey: varNames[i])
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

几件事要解释:

  1. Serializable是一个定义方法的协议,包括init(字典).它被希望(反)序列化的对象所采用.
  2. Serializable还指定了"序列化键"的计算属性或用作对象变量的字典键的字符串列表,并且必须是变量名到序列化键的一对一映射.为什么这样?有时候,API调用会返回不再有意义的键(架构腐烂?),或者我只是想以不同的方式命名变量,因为我不太喜欢下划线.
  3. 该模型必须既NSObject符合又符合Serializable.为什么?为了实现这样的泛型,我需要能够在不知道标识符的情况下写入对象的字段.Swift本身没有办法做到这一点,所以继承NSObject是一个很好的折衷方案.为什么不使用具有这些功能的根对象呢?

我的目标是从JSON表示中对象的愚蠢容易,低开销构造(即使使用不同的键和变量名,甚至使用嵌套对象).所以给一个对象它的键列表,并使协议init调用另一个泛型构造函数,它迭代对象的变量并每次调用它.巴姆.就这样.现在,您可以解析所有(JSON)API中的所有内容,并编写极少或无需解析的逻辑.我希望同样适用于序列化程序,这样toDictionary也只需要一个通用的方法调用.

在这个函数中,我们使用反射动态设置对象的值.首先,我们确保这是在对象上设置的有效键.接下来,我们确定我们要设置的值是否是字典.如果是,我想抓住目标对象的类型,看它是否实际上也是Serializable一致的类型.如果该字段是,我们可以使用这个字典递归地构造它(这不会像下面解释的那样工作).如果不是,或者该值根本不是字典,只需使用Cocoa的setValue:forKey:方法.

唉,我无法让嵌套对象部分正常工作,而且我还没弄清楚我想要做的事情是不可能的,或者我是不是做错了.let finalObj尽管Xcode没有错误,我也担心我的线路无效.我的思维过程只是召唤Serializableinit构造者,继续我的快乐方式.我假设这个问题是Swift的静态类型性质,并且编译器实际上并不知道init将返回什么样的最终类型(尽管,Xcode突出显示t2该行中与关键字颜色相同的颜色......).我真的不知道,如果有一种方法说T1是NSObject符合Serializable.我认为我现在正在尝试t2和演员正在丢失类型信息并因此导致seg错误,尽管Xcode在我真正去构建之前不会抱怨它.

我已经尝试了几种方法来协调这个嵌套的Serializable东西,并且无法提出解决方案.有人能帮忙吗?

use*_*195 0

看看这篇文章,其他人做了和你正在尝试的事情一样的事情。它可能对您有帮助,或者它实际上可能正是您正在寻找的: https: //www.weheartswift.com/swift-objc-magic/