массив фильтров на основе другого - PullRequest
0 голосов
/ 02 октября 2019

У меня есть два массива, один массив массивов профилей и одно из имен разделов:

var sections: [Array<Profile>] = [friends, contacts, other]
var sectionNames = ["Friends", "Contacts", "Other Users"]

Как отфильтровать имена на основе того, являются ли разделы пустыми? Я получаю сообщение об ошибке при попытке ввести следующий код:

sectionNames.filter { index, _ in
    sections[index].count > 0
}

Contextual closure type '(String) throws -> Bool' expect 1 argument, but two given

Ответы [ 2 ]

2 голосов
/ 02 октября 2019

Вы можете использовать zip и compactMap:

let nonEmptySections = zip(sections, sectionNames).compactMap { $0.isEmpty ? nil : $1 }

Использование zip имеет то преимущество, что вы не получите сбоев, если два массива имеют разные размеры. С другой стороны, это может привести к незначительным ошибкам.

Я бы рекомендовал вместо этого использовать структуру данных для моделирования ваших данных:

struct Section {
    let name: String
    let profiles: [Profile]
}

Это должно упростить процесс обработкиразделы в вашем приложении. А с помощью предложения @ Alexander вы можете добавить свойство isEmpty в структуру, что сделает использование

extension Section {
    var isEmpty: Bool { return profiles.isEmpty }
}

... later in the code

let nonEmptySections = sections.filter { !$0.isEmpty }
еще проще.
0 голосов
/ 02 октября 2019

вы можете попробовать что-то вроде этого

var ar1:[Array<Int>] = [[1,2],[3,4,],[],[5,6]]
var ar2 = [1,2,3,4]
ar2 = (0 ..< ar1.count).filter {ar1[$0].count > 0}.map {ar2[$0]}
print(ar2) // [1, 2, 4]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...