斯威夫特:财产名称的插值?

时间:2016-01-28 18:38:53

标签: arrays swift interpolation variable-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中是否可以进行变量/属性名称插值?如果是这样,我该怎么做?

此外,使用二维数组处理此问题会更好吗?如果是这样,我该怎么做?

3 个答案:

答案 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中似乎不可能(并且明智地这样)。