protocol ListsPropertIEs{ func toDictionary() -> [String: AnyObject]}extension ListsPropertIEs{ func toDictionary() -> [String: AnyObject] { let mirrored_object = Mirror(reflecting: self) var dict = [String: AnyObject]() for (_,attr) in mirrored_object.children.enumerate() { if let propertyname = attr.label as String! { dict[propertyname] = attr.value as? AnyObject } } return dict }}
我的类可以符合这个协议,并且可以使用toDictionary()方法.但是,如果我在子类上使用该方法,则这不起作用,因为它只生成在子类上定义的属性并忽略父超类属性.
理想情况下,我可以找到一些方法来调用镜像超类上的toDictionary()方法,因为这会在它自己的超类上调用toDictionary(),并且编译器说超类镜像不符合协议,即使它正在镜像的类确实.
以下工作,但只有当只有一个超类时,这是不够的:
func toDictionary() -> [String: AnyObject] { let mirrored_object = Mirror(reflecting: self) var dict = [String: AnyObject]() for (_,attr) in mirrored_object.children.enumerate() { if let propertyname = attr.label as String! { dict[propertyname] = attr.value as? AnyObject } } // This is an issue as it limits to one subclass 'deep' if let parent = mirrored_object.superclassMirror(){ for (_,attr) in parent.children.enumerate() { if let propertyname = attr.label as String!{ if dict[propertyname] == nil{ dict[propertyname] = attr.value as? AnyObject } } } } return dict}
关于如何修改toDictionary()的默认实现以包含超类属性(以及超类的任何超类的属性等)的任何想法?
一种可能的解决方案是实现toDictionary()作为Mirror本身的一种方法,以便您可以递归遍历
到超类镜像:
extension Mirror { func toDictionary() -> [String: AnyObject] { var dict = [String: AnyObject]() // PropertIEs of this instance: for attr in self.children { if let propertyname = attr.label { dict[propertyname] = attr.value as? AnyObject } } // Add propertIEs of superclass: if let parent = self.superclassMirror() { for (propertyname,value) in parent.toDictionary() { dict[propertyname] = value } } return dict }}
然后使用它来实现协议扩展方法:
extension ListsPropertIEs { func toDictionary() -> [String: AnyObject] { return Mirror(reflecting: self).toDictionary() }}总结
以上是内存溢出为你收集整理的Swift 2.0获取镜像超类属性全部内容,希望文章能够帮你解决Swift 2.0获取镜像超类属性所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)