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