2016-05-18 121 views
0

做一個假設:如何在swift中獲取結構體中的變量名?

struct A{ var a:String; var b:Int } 

我怎樣才能使一個for循環或一些其他的方式來獲得一個結構體變量的名字呢?

+0

https://developer.apple.com/library/watchos/documentation /Swift/Reference/Swift_Mirror_Structure/index.html – jtbandes

+3

你將不得不使用反射。但如果你認爲你需要這樣做,那麼再想一想。 – matt

回答

5

Mirror是在Swift中進行反射的類(它實際上是一個結構體)。下面是枚舉結構屬性的一個非常簡單的例子。

let a = A(a: "abc", b: 1) 
let mirror = Mirror(reflecting: a) 
for child in mirror.children { 
    print(child.label!) 
    print(child.value) 
} 

和輸出將是:

a 
abc 
b 
1 

上找到斯威夫特反射API後這是值得一讀:https://appventure.me/2015/10/24/swift-reflection-api-what-you-can-do/

+0

鏡像僅建議用於Playgrounds和調試。如果不幸在生產中使用,它會泄漏內存。 – aBikis

+1

@aBikis雖然文檔中提到「遊戲機和調試器使用鏡像」,但這並不一定意味着它們不能用於生產。就我個人而言,我懷疑這種反射對於光的使用會明顯緩慢。 –

+0

我也這麼認爲!但它實際上運行速度爲3.5 X! [鏈接](https://appventure.me/2015/10/24/swift-reflection-api-what-you-can-do/)這不是什麼大不了的事,但它實際上創造了大量的記憶同時使用幾乎相同的代碼來完成上面的代碼。一個Apple沒有記錄的問題,但是當它被用作許多Structs的協議時,它最終導致我的應用程序崩潰。 – aBikis