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

Я хочу прокрутить мои представления в представлении, и для каждого цикла 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 })) 
  • Реализация метода протокола по умолчанию с расширением Swift
  • Запрос GeoFire на местоположение пользователя
  • watchOS 2: настройка свойств на начальном интерфейсном контроллере
  • Я получил исключение из dateFormatter с помощью «EEE MMM dd HH: mm: ss z yyyy»
  • Swift: Как получить правильную высоту UICollectionView при использовании snapkit?
  • Получение ошибки «Нет такого модуля» с использованием Xcode, но структура существует
  • Что означает этот аварийный журнал Swift iPad?
  • Рекомендации по ReactiveCocoa с CoreData
  • Выбирая MKAnnotation, чтобы «выбрать», это ДЕЙСТВИТЕЛЬНО медленно
  • ViewController не отображается, даже если функция segue была запущена
  • Как добавить тип протокола в качестве подзадачи
  • Interesting Posts

    Как изменить текст кнопки возврата uinavigationbar назад

    Удалить вложенный ключ из словаря

    клавиатура textview не уходит в отставку, когда я нажимаю iOS

    Swift 2.0 Core Data – TableView не читает NSManagedObject

    Pywin32 (объекты com) на Mac

    Непредвиденная ошибка Xcode (0xC011) после запуска программы и когда я нажимаю на органайзер

    Нахождение расстояния между точками CLLocationCoordinate2D

    Измените подробный вид из приложения MasterDetail iPad с помощью раскадровки

    Эффективный способ использования Core Image на iOS?

    «Обычный стиль, не поддерживаемый в элементе навигации», с моей настраиваемой кнопкой «Панель»

    Отсутствует звук от AVPlayer

    ios silent push уведомление, когда пользователь отказывается от авторизации Push

    Цель C: Как изменить цвет текста в панели навигации

    Получение всех групповых сообщений при подключении к xmpp с iOS и конца Android

    iOS 7: Как пересчитать маршруты с помощью Map Kit

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.