Рекурсивный цикл массива массивов с использованием функциональных

Я хочу прокрутить мои представления в представлении, и для каждого цикла subview через его подпрограммы и т. Д.

поэтому позвольте сказать, что у меня есть следующий код:

let view = myVC.view view.backgroundColor = UIColor.clearColor() 

затем повторите это для каждого подзаголовка. Я хочу сделать это функционально.

любое понимание очень ценится.

РЕДАКТИРОВАТЬ:

дать понять

Я ищу что-то вроде этого:

 view.subviews.chanageColor() { (aView, aColor) in aView.backgroundColor = aColor } 

но он должен быть рекурсивным, он относится к каждому представлению представления.

4 Solutions collect form web for “Рекурсивный цикл массива массивов с использованием функциональных”

Используйте очередь вместо рекурсии.

Я думаю, вы могли бы сделать что-то вроде этого …

 extension UIView { func changeColor(color: UIColor) { var queue = [self] while let view = queue.first() { queue += view.subviews view.backgroundColor = color queue.remove(view) } } } 

Я бы сделал это с очередью, а не рекурсивно. Однако этот метод не работает.

Выполнение вашего вопроса

Вы могли бы сделать так, что вы задали в своем вопросе как то, что вы хотели сделать.

 extension UIView { // this name isn't very good but you get the idea func applyChangeToAllSubviews(block: (UIView) -> ()) { var queue = [self] // I don't have my dev computer dos not sure of the syntax while let view = queue.first() { queue += view.subviews block(view) queue.remove(view) } } } 

Затем запустите его, как …

 someView.applyChangeToAllSubviews { view in view.backgroundColor = UIColor.whiteColor() } 

Наверное, это немного более функционально … иш.

Что-то вроде этого?

 func makeAllSubviewsClear(view: UIView!) { view.backgroundColor = UIColor.clearColor() for eachSubview in view.subviews { makeAllSubviewsClear(eachSubview) } } 

вызванный через:

 let view = myVC.view makeAllSubviewsClear(view) 

Как насчет follwing:

 let _ = myVC.view.subviews.map{ $0.backgroundColor = UIColor.clearColor() } 

Хотя карта должна использоваться по-разному imho.

EDIT: Я только что посмотрел, что OP хочет рекурсивный цикл, который другой. Вы должны переместить этот код в функцию и вызвать его рекурсивно для каждого $ 0.

Что-то вроде этого возможно:

 extension Array where Element: UIView { func changeColor(color: UIColor) { for view in self { view.subviews.changeColor(color) view.backgroundColor = color } } } 

Выглядит функционально и может быть названо так:

 myVC.view.subviews.changeColor(color) 

Вдохновленный @fogmaister еще одно решение:

 extension Array where Element: UIView { func applyChange(closure: (UIView)->()) { for view in self { view.subviews.applyChange(closure) closure(view) } } } 

Вот возможное общее решение, которое позволяет пересекать любую «вложенную последовательность». Он не ограничивается UIView и UIView , но принимает параметр, который отображает каждый элемент последовательности на его непосредственных детей.

Он также отделяет задачу прохождения последовательности из действия над элементами (например, установки цвета фона), возвращая Generator который можно использовать с существующими методами, например, forEach() .

(Это вдохновлено некоторыми ответами на Реализация рекурсивного генератора для простой древовидной структуры в Swift .)

 extension SequenceType { public func generate<S : SequenceType where S.Generator.Element == Generator.Element> (children children: Generator.Element -> S) -> AnyGenerator<Generator.Element> { var selfGenerator = self.generate() var childGenerator : AnyGenerator<Generator.Element>? return anyGenerator { // Enumerate all children of the current element: if childGenerator != nil { if let next = childGenerator!.next() { return next } } // Get next element of self, and prepare subGenerator to enumerate its children: if let next = selfGenerator.next() { childGenerator = children(next).generate(children: children) return next } return nil } } } 

В качестве примера, если view является UIView тогда

 view.subviews.generate(children: { $0.subviews }) 

возвращает (ленивый) генератор всех (вложенных) подзонов. forEach() на этом генераторе, мы можем изменить каждый подзаголовок:

 view.subviews.generate(children: { $0.subviews }).forEach { $0.backgroundColor = UIColor.clearColor() } 

Но он также может быть использован для получения массива со всеми вложенными областями:

 let allViews = Array(view.subviews.generate(children: { $0.subviews })) 
  • Почему мой плагин для ткани пуст после распространения новой сборки?
  • Nil несовместим с типом возврата «MKOverlayRenderer»
  • Есть ли альтернатива для NSInvocation в Swift?
  • Сохранить состояние для индикатора активности в ячейке
  • Изменить назначение кнопки «Назад»
  • IOS Swift и Facebook SDK
  • SceneKit: как обновить SCNGeometrySource
  • ScrollView в файле NIB Swift
  • Swift - обновить / обновить ярлык, отображающий время
  • application (_: didFinishLaunchingWithOptions :) 'почти соответствует необязательному требованию
  • Как я могу условно перехватить события касания?
  • Требуется фиксированная ориентация, но авторизованный UIImage
  • Interesting Posts
    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.