2016-10-02 2 views
0

Таким образом, единственный способ, которым я могу достичь этого, - поместить массив внутри mainArray в переменную, а затем проиндексировать ее. Есть ли более простой способ?Как получить элемент массива внутри другого массива?

mainArray   = [ 3400, "Overwatch", [UIButton(), UIButton()]] // Some buttons already made 
    currentButtonArray = mainArray[mainArray.count - 1] as! NSArray 

    for i in 0..<currentButtonArray.count { 
     buttonArray.append(currentButtonArray[i] as! UIButton) 
    } 
+1

Это, вероятно, неподходящая структура данных - что именно вы используете этот массив для? – Hamish

+0

@Hamish Моя цель - время от времени я буду проверять основной массив, если он добавит кнопки (что будет), и отключит userInteraction для этих недавно добавленных кнопок (после нажатия), перейдя через кнопкуArray – Whitebeard

+1

Но что же представляет собой содержимое из 'mainArray'? Целые числа, строки и '[UIButton]' s не связаны. – Hamish

ответ

1

Если есть один массив, содержащий только UIButton экземпляров, всего filter.

let mainArray : [Any] = [3400, "Overwatch", [UIButton(), UIButton()]] 
if let buttonArray = mainArray.filter({$0 is [UIButton]}).first as? [UIButton] { 
    print(buttonArray) 
} 

или

let buttonArray = Array(mainArray.flatMap{$0 as? [UIButton]}.joined()) 

Второй подход возвращает не необязательный пустой массив, если не существует массива UIButton в mainArray

+1

Или вы можете сделать 'mainArray.flatMap ({$ 0 as? [UIButton]}). First';) Если имеется более одного массива, вы можете сделать' .lazy.flatMap', чтобы обеспечить что он прекращает итерацию при поиске первого '[UIButton]'. – Hamish

+0

Будут более одного набора кнопок. Пользуюсь ли я таким же подходом? – Whitebeard

+0

Какой результат вы ожидаете? Результатом решения «flatMap» является один массив, содержащий все кнопки. Решение 'filter' возвращает только первый массив. – vadian

1

Если подмассив имеет всего одного типа, вы можете добавить все в один присест:

var buttonArray = [UIButton]() 
let mainArray:[Any] = [3400, "Overwatch", [UIButton(), UIButton()]] // Some buttons already made 
if let currentButtonArray = mainArray.last as? [UIButton] { 
    buttonArray.append(contentsOf: currentButtonArray) 
} 

Или вы могли бы просто написать:

guard let currentButtonArray = mainArray.last as? [UIButton] else { 
    // do something e.g. return or break 
    fatalError() 
} 
// do stuff with array e.g. currentButtonArray.count 

Если вы не знаете, положение в массиве вложенного массива UIButton или если было несколько вложенных матриц кнопок, тогда это будет работать:

let buttonArray = mainArray.reduce([UIButton]()){ (array, element) in if let bArray = element as? [UIButton] { 
     return array + bArray 
    } 
    else { 
     return array 
    } 
} 

Примечание: это код Swift 3.

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