2017-05-05 86 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中解決這個問題,所以我只會很傻,希望你喜歡我的改變。 –