2016-11-27 89 views
0

我試圖從從一個類繼承,這裏對象打印所有的值是我的例子:列出所有類屬性SWIFT 3

我創建類:

class Pokemon { 

var name: String? 
var type: String? 
var level: Int? 
var exp = 0.0 
} 

創建對象並分配一些值:

var pikachu = Pokemon() 

pikachu.name = "Pika Pika" 
pikachu.level = 1 
pikachu.type = "electricity" 
pikachu.exp = 0 

現在我想遍歷所有的皮卡丘對象屬性並打印值。我在考慮每個循環,但我不知道如何實現它。

我知道我可以做這樣的事情:

func printStats(pokemon: Pokemon) { 

if pokemon.name != nil { 

    print(" name: \(pokemon.name!)\n level:\(pokemon.level!)\n type:\(pokemon.type!)\n exp: \(pokemon.exp!)") 

} 
} 

printStats(pokemon: pikachu) 

輸出:

name: Pika Pika 
level:1 
type:electricity 
exp: 0.0 

但我只是想通過所有值循環,而不是明確的書面功能的每個屬性。

回答

4

我發現它這樣做的方式:

let pokeMirror = Mirror(reflecting: pikachu) 
let properties = pokeMirror.children 

for property in properties { 

    print("\(property.label!) = \(property.value)") 

} 

輸出:

name = Optional("Pika Pika") 
type = Optional("electricity") 
level = Optional(1) 
exp = Optional(0.0) 

,如果你想刪除 「可選」 只是初始化屬性。

2

貌似的Does Swift support reflection?

重複或者,您可以使用字典來存儲Any?類型的屬性。

例如

class Pokemon { 
    var attributes = [String:Any?]() 
} 

var pikachu = Pokemon() 

pikachu.attributes["name"] = "Pika Pika" 
pikachu.attributes["level"] = 1 
pikachu.attributes["type"] = "electricity" 
pikachu.attributes["exp"] = 0 

func printStats(pokemon: Pokemon) { 
    pokemon.attributes.forEach { key, value in 
     if let value = value { 
      print("\(key): \(value)") 
     } 
    } 
}