我试图打印一个继承自类的对象的所有值,这是我的例子:
我创建了这个类:
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
但我只想循环遍历所有值,而不是显式写入函数中的每个属性。
答案 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)
如果你想删除" Optional"只是初始化属性。
答案 1 :(得分:2)
看起来像是Does Swift support reflection?
的副本或者,您可以使用字典存储element(by.id('result0')).isPresent().then(function (result) {
if (result) {
browser.ignoreSynchronization = true;
element(by.id('result0')).click();
browser.sleep(3000); // TODO: use ExpectedConditions?
expect(element(by.css('h2.modal-title')).isPresent()).toBe(true);
} else {
expect(element(by.css('h2.modal-title')).isPresent()).toBe(false);
}
});
browser.ignoreSynchronization = false;
类型的属性。
e.g。
Any?
答案 2 :(得分:0)
Mirror API
获取实例的属性print
打印实例。镜像描述组成特定实例的部分,例如实例的存储属性、集合或元组元素,或其活动枚举案例。
class YourClass: NSObject {
public override var description: String {
var des: String = "\(type(of: self)) :"
for child in Mirror(reflecting: self).children {
if let propName = child.label {
des += "\(propName): \(child.value) \n"
}
}
return des
}
}
let instance = YourClass()
print(instance)
在Reflection in Swift中查看更多