Swift:属性 名称的插值?

Swift: Interpolation of Property Names?

是否可以在 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 中使用 variable/property 名称插值?如果可以,我该怎么做?

另外,这个用二维数组处理是不是更好一些?如果是这样,我该怎么做?

您可能需要字典而不是数组。为什么不做类似的事情:

var rotation = [groupA, groupB, groupC]

您也可以在这样的数组数组上使用 flatMap。

使用 2D 字符串数组,具有与您示例中相同的嵌套 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)
    }
}

为了进行技术讨论,您可以通过使用运行时内省和基础class NSObject 对 属性 名称进行插值].现在,我看不到任何人 ever 实际上求助于此,因为它以我不能的方式非 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 { [=11=].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   */

非常感谢你们三位的快速帮助! :)

对于其他可能想知道的人,我的最终代码如下:

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 中似乎是不可能的,可能(并且明智地)是因为他们强调类型安全。