[英]Change value in class with variable from For loop
我有以下关于swift的问题,可以说我有一个像这样的课程:
class Person {
var firstName, lastName, eyeColor: String
init(firstName: String = "", lastName: String = "", eyeColor: String = "") {
self.firstName = firstName
self.lastName = lastName
self.eyeColor = eyeColor
}
}
例如,我可以创建一个像这样的人:
var myFriend = Person(firstName: "Robin", eyeColor: "Yellow")
但是,正如您现在可以知道的那样,我尚未为lastName分配一个值,即为空或“”。
我想要做的是遍历myFriend中的所有值,并检查一个值是否为空,如果是的话,我想用“无信息”之类的值替换空值。
我确实找到了类似的东西
let mirroredRecord = Mirror(reflecting: myFriend)
for (index, attr) in mirroredRecord.children.enumerated() {
if var value = attr.label as String? {
if value == "" {
value = "No info"
}
print("Attr \(index): \(value) = \(attr.value)")
}
}
但是,这不会更改myFriend变量中的值。
在我看来,以下内容似乎合乎逻辑,但我不确定如何迅速执行此操作。
for (index, attr) in mirroredRecord.children.enumerated() {
if var value = attr.label as String? {
if value == "" {
myFriend.value = "No info"
}
print("Attr \(index): \(value) = \(attr.value)")
}
}
但是,由于.value不是选项之一(名字,姓氏,eyeColor),因此不喜欢它。
有人对此有任何选择或解决方案吗?
如果使用KeyPath
表示要更新的字段,则可以使用for
循环更新class
:
func update() {
let kpaths: [ReferenceWritableKeyPath<Person, String>] = [\.firstName, \.lastName, \.eyeColor]
for path in kpaths {
if self[keyPath: path].isEmpty {
self[keyPath: path] = "No information"
}
}
}
就是说,我建议只使用nil
代表"No Information"
可选参数 。
class Person {
var firstName, lastName, eyeColor: String?
init(firstName: String? = nil, lastName: String? = nil, eyeColor: String? = nil) {
self.firstName = firstName
self.lastName = lastName
self.eyeColor = eyeColor
}
}
然后,当您访问字段时,可以使用nil合并运算符 ??
拆开值并显示nil
值,但是您喜欢:
someLabel.text = self.firstName ?? ""
要么:
someLabel.text = self.firstName ?? "No information"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.