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)
几件事要解释:
Serializable
是一个定义方法的协议,包括init(字典).它被希望(反)序列化的对象所采用.Serializable
还指定了"序列化键"的计算属性或用作对象变量的字典键的字符串列表,并且必须是变量名到序列化键的一对一映射.为什么这样?有时候,API调用会返回不再有意义的键(架构腐烂?),或者我只是想以不同的方式命名变量,因为我不太喜欢下划线.NSObject
符合又符合Serializable
.为什么?为了实现这样的泛型,我需要能够在不知道标识符的情况下写入对象的字段.Swift本身没有办法做到这一点,所以继承NSObject是一个很好的折衷方案.为什么不使用具有这些功能的根对象呢?我的目标是从JSON表示中对象的愚蠢容易,低开销构造(即使使用不同的键和变量名,甚至使用嵌套对象).所以给一个对象它的键列表,并使协议init
调用另一个泛型构造函数,它迭代对象的变量并每次调用它.巴姆.就这样.现在,您可以解析所有(JSON)API中的所有内容,并编写极少或无需解析的逻辑.我希望同样适用于序列化程序,这样toDictionary
也只需要一个通用的方法调用.
在这个函数中,我们使用反射动态设置对象的值.首先,我们确保这是在对象上设置的有效键.接下来,我们确定我们要设置的值是否是字典.如果是,我想抓住目标对象的类型,看它是否实际上也是Serializable
一致的类型.如果该字段是,我们可以使用这个字典递归地构造它(这不会像下面解释的那样工作).如果不是,或者该值根本不是字典,只需使用Cocoa的setValue:forKey:方法.
唉,我无法让嵌套对象部分正常工作,而且我还没弄清楚我想要做的事情是不可能的,或者我是不是做错了.let finalObj
尽管Xcode没有错误,我也担心我的线路无效.我的思维过程只是召唤Serializable
的init
构造者,继续我的快乐方式.我假设这个问题是Swift的静态类型性质,并且编译器实际上并不知道init将返回什么样的最终类型(尽管,Xcode突出显示t2
该行中与关键字颜色相同的颜色......).我真的不知道,如果有一种方法说T1是NSObject
这也符合Serializable
.我认为我现在正在尝试t2
和演员正在丢失类型信息并因此导致seg错误,尽管Xcode在我真正去构建之前不会抱怨它.
我已经尝试了几种方法来协调这个嵌套的Serializable
东西,并且无法提出解决方案.有人能帮忙吗?
看看这篇文章,其他人做了和你正在尝试的事情一样的事情。它可能对您有帮助,或者它实际上可能正是您正在寻找的: https: //www.weheartswift.com/swift-objc-magic/
归档时间: |
|
查看次数: |
1924 次 |
最近记录: |