2017-05-05 46 views
1

我正在构建一个函数,将采取一个类对象的实例,并将其转换为XML请求发送到Web服务。为了实现这一点,我使用镜像来遍历类中的键/值对。在我的测试中,我发现它工作得很好,有一个主要问题,没有任何继承的类参数出现。例如,在下面的代码中,循环被执行了三次,因为“descriptionText,modelNumber和serialNumber,name和uuid都不会被收集。有没有办法让我使用镜像并获取基类的所有参数,如?还有小部件此外,如果有更好的方式来做到这一点,我所有的耳朵镜像不拾起基类Swift 3

import UIKit 

class BaseObject: NSObject { 
    var name = String() 
    var uuid = String() 
} 

class Widget: BaseObject { 
    var descriptionText = String() 
    var modelNumber = String() 
    var serialNumber = String() 
} 

var widget1 = Widget() 

widget1.name = "Generic Widget" 
widget1.uuid = "A guid" 
widget1.descriptionText = "Class A Extra Larget Widget" 
widget1.modelNumber = "1234" 
widget1.serialNumber = "4321" 

let widgetMirror = Mirror(reflecting: widget1) 

for attr in widgetMirror.children { 
    print(attr.label!) 
} 

回答

1

您需要使用superclassMirror: Mirror?属性,用于例如:。

for attr in widgetMirror.superclassMirror!.children { 
    print(attr.label!) 
} 

打印预期成果:


UUID


更新。如果你一直运行到这一点,这Mirror扩展添加到您的工具箱:

extension Mirror { 
    var allChildren: [Mirror.Child] { 
     var allChildren: [Mirror.Child] = [] 
     var mirror: Mirror! = self 
     repeat { 
      allChildren.append(contentsOf: mirror.children) 
      mirror = mirror.superclassMirror 
     } while mirror != nil 
     return allChildren 
    } 
} 

用法:

for attr in widgetMirror.allChildren { 
    print(attr.label!) 
} 
+1

谢谢!我会在3分钟内接受你的回答,你的计算机显然太快了! – GED125

+0

@ GED125 haha​​ :-) –

1

的部分答案已经发布,但这里是包装这一切的方式。

var mirror: Mirror? = Mirror(reflecting: widget1) 

repeat { 
    for (index, child) in mirror!.children.enumerated() { 
     print (child.label!) 
    } 

    mirror = mirror?.superclassMirror 
} while mirror != nil 

我考虑多一点。我认为这是更Swifty。

extension Mirror { 

    var posterity: Children { 
     if let superclassMirror = superclassMirror { 
      return Children([children, superclassMirror.posterity].joined()) 
     } else { 
      return children 
     } 
    } 

} 

let widgetMirror = Mirror(reflecting: widget1) 

for child in widgetMirror.posterity { 
    print(child.label!) 
} 
+0

只是一个简单的问题:'后代'的名称是误导性的,因为它并不遵循内置'后代(_:_ :)'函数的相同*语义*。我用'allChildren',但我不高兴:(命名的东西确实很难,哈哈... –

+0

@PauloMattos是的,我没有考虑'后代(_:_ :)',我不喜欢'allChildren'然而,我不需要在StackOverflow中解决这个问题,所以我只会很傻,希望你喜欢我的改变。 –