2016-01-28 3 views
0

Возможно ли в Swift интерполяция имен свойств (переменных) из содержимого других свойств? В сегменте кода ниже: В первом цикле for я хотел бы установить свойство eachItem на имя элемента, содержащееся в массиве вращения. Затем во втором внутреннем цикле for я хочу выполнить итерацию по массиву с именем того, что находится в свойстве eachItem.Swift: Интерполяция имен собственности?

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) 
    } 
} 

Итерации через два для петель даст нам:

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

Большое спасибо всем вам троим для вашей быстрой помощи! :)

Для других, которые хотят знать, мой окончательный код ниже:

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, возможно (и разумно так) из-за их акцента на безопасность типов.

0

Возможно, вам нужен словарь, а не массив. Почему бы просто не сделать что-то вроде:

var rotation = [groupA, groupB, groupC]

Вы также можете использовать flatMap на массив массивов, как это.

+0

Массив массивов! Я не думал об этом, и он должен отлично работать –

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 */ 
+0

. Это действительно сработало, хотя вам не нужно явно вводить свойства, так как вывод типа отлично работает здесь. Фактически, для лучшей практики документация Swift рекомендует явно не объявлять типы свойств, если Swift не может вставить тип из его кода. –

+0

@SillyGoof Я добавил здесь явные типы, чтобы избавиться от лишнего света (от OP) от того, как массивы строк помещаются как члены в массив строковых массивов, но хорошо, что вы указываете на это, поэтому читатели не делают это как необходимость, спасибо. – dfri

+0

Я очень ценю это глубокое погружение в интерполяцию. Теперь возникает вопрос: если можно сделать интерполяцию имен свойств в Objective-C, хотя и крайне беспорядочно, мне интересно, могут ли они построить мост, чтобы мы могли сделать это, это была легкая, Swift-y манера? –

 Смежные вопросы

  • Нет связанных вопросов^_^