在Swift中是否可以从其他属性的内容中插入属性(变量)名称?在下面的代码段中,在第一个for循环中,我想将属性eachItem设置为旋转数组中包含的项名称。然后在第二个内部for循环中,我想遍历由eachItem属性中的内容命名的数组。
var groupA = ["groupA1", "groupA2", "groupA3"]
var groupB = ["groupB1", "groupB2", "groupB3", "groupB4", "groupB5", "groupB6"]
var groupC = ["groupC1", "groupC2", "groupC3", "groupC4", "groupC5"]
var rotation = ["groupA", "groupB", "groupC"]
for eachGroup in rotation {
for eachItem in \(eachGroup) {
print(eachItem)
}
}
通过两个for循环的迭代将给我们:
eachGroup = "groupA"
eachItem = "groupA1"
eachItem = "groupA2"
eachItem = "groupA3"
eachGroup = "groupB"
eachItem = "groupB1"
eachItem = "groupB2"
eachItem = "groupB3"
eachItem = "groupB4"
eachItem = "groupB5"
eachItem = "groupB6"
eachGroup = "groupC"
eachItem = "groupC1"
eachItem = "groupC2"
eachItem = "groupC3"
eachItem = "groupC4"
eachItem = "groupC5"
Swift中是否可以进行变量/属性名称插值?如果是这样,我该怎么做?
此外,使用二维数组处理此问题会更好吗?如果是这样,我该怎么做?
答案 0 :(得分:0)
您可能需要字典而不是数组。为什么不这样做:
var rotation = [groupA, groupB, groupC]
你也可以在像这样的数组数组上使用flatMap。
答案 1 :(得分:0)
使用2D-String数组,使用与示例中相同的嵌套for .. in
循环:
var groupA : [String] = ["groupA1", "groupA2", "groupA3"]
var groupB : [String] = ["groupB1", "groupB2", "groupB3", "groupB4", "groupB5", "groupB6"]
var groupC : [String] = ["groupC1", "groupC2", "groupC3", "groupC4", "groupC5"]
var rotation : [[String]] = [groupA, groupB, groupC]
for eachGroup in rotation {
for eachItem in eachGroup {
print(eachItem)
}
}
为了技术讨论,您可以通过使用运行时内省和基础类NSObject
来 插入属性名称。现在,我看不到任何人永远实际上诉诸于此,因为它是非Swifty的方式我不能......(所以不要),但请注意它可以完成:
class Container : NSObject {
let dummyArr : [String] = []
let groupA : [String] = ["groupA1", "groupA2", "groupA3"]
let groupB : [String] = ["groupB1", "groupB2", "groupB3", "groupB4", "groupB5", "groupB6"]
let groupC : [String] = ["groupC1", "groupC2", "groupC3", "groupC4", "groupC5"]
init(_ rotation: [String]) {
super.init()
let a = Mirror(reflecting: self).children.filter { $0.label != nil }
for eachGroup in a where eachGroup.label != "dummyArr" {
print("eachGroup: \(eachGroup.label ?? "")")
let b = self.valueForKey(eachGroup.label ?? "dummyArr")
if let eachGroup = b as? [String] {
for eachElement in eachGroup {
print("\teachElement = \(eachElement)")
}
}
}
}
}
var rotation = ["groupA", "groupB", "groupC"]
let _ = Container(rotation)
打印输出:
/* eachGroup: groupA
eachElement = groupA1
eachElement = groupA2
eachElement = groupA3
eachGroup: groupB
eachElement = groupB1
eachElement = groupB2
eachElement = groupB3
eachElement = groupB4
eachElement = groupB5
eachElement = groupB6
eachGroup: groupC
eachElement = groupC1
eachElement = groupC2
eachElement = groupC3
eachElement = groupC4
eachElement = groupC5 */
答案 2 :(得分:0)
非常感谢你们三位的快速帮助! :)
对于其他可能想知道的人,我的最终代码如下:
var groupA = ["groupA1", "groupA2", "groupA3"]
var groupB = ["groupB1", "groupB2", "groupB3", "groupB4", "groupB5", "groupB6"]
var groupC = ["groupC1", "groupC2", "groupC3", "groupC4", "groupC4"]
var rotation = [groupA, groupB, groupC]
for eachGroup in rotation {
for eachItem in eachGroup {
print(eachItem)
}
}
关于属性名称插值的原始问题,由于强调类型安全性,在Swift中似乎不可能(并且明智地这样)。