2016-11-27 2 views
0

Я пытаюсь напечатать все значения из объекта, который наследует от класса, вот мой пример:Листинг всех атрибутов класса скор 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)") 
     } 
    } 
} 
Смежные вопросы