Функция фильтрует индексы одинаковых лет в одном массиве из другого.
Я ищу более короткое решение моего кода:
let years = (2015...2025).map { $0 }
var chosenYears = [2015, 2019, 2016] (example)
Эта функция делает то, что я хочу, но я кое-что ищу (посмотрите больше на functional-programming).
func selectChoseYears() {
for (index, year) in years.enumerated() {
for chosenYear in chosenYears {
if year == chosenYear { view?.selectCell(at: index) }
}
}
}
Я пробовал некоторые решения, но они выглядят уродливее и длиннее этого.
Спасибо.
@Султан прав. Вы также должны учитывать «эффективность», когда речь идет о коллекциях и перечислениях.



пытаться :
let result = (2015...2025).map { $0 }.filter { [2015, 2019, 2016].contains($0)}
Это даже не компилируется... Вы имели в виду [2015,2019,2016].contains($0)? Кстати, нет необходимости вызывать map на Range, чтобы преобразовать его в Array, Array(2015...2025) работает просто отлично.
Есть много возможных решений, например:
let yearIndices = chosenYears.compactMap { years.index(of: $0) }
for yearIndex in yearIndices {
view?.selectCell(at: yearIndex)
}
или просто
for (index, year) in years.enumerated() where chosenYears.contains(year) {
view?.selectCell(at: index)
}
Хорошее решение. Спасибо!
Кроме того, можно подумать о том, чтобы сделать chosenYearsSet вместо массива. Это сделало бы второе решение еще более эффективным.
Вы можете попробовать что-то вроде этого:
self.tableView.visibleCells
.flatMap { $0 as? MyCell }
.forEach { $0.updateView(isSelected: chosenYears.contains($0.viewModel?.year) }
Хотя для этого требуется, чтобы в ячейках хранилась модель представления с указанием года, который она представляет, и вам необходимо реализовать updateView(isSelected:)
Вы можете напрямую фильтровать indices
years.indices.filter{ chosenYears.contains(years[$0]) }.forEach { view?.selectCell(at: $0) }
Я полностью согласен с комментарием Султана. Однако я бы заменил более читаемый и проще на более эффективным.
Спасибо. Мне тоже нравится это решение!
Вы можете найти индексы любых элементов Equatable с помощью следующей функции
func indexes<T: Equatable>(of chosen: [T], in all: [T]) -> [Int] {
return all.enumerated().filter { chosen.contains($0.element) }.map { $0.offset }
}
indexes(of: chosenYears, in: years)
Зачем именно вам нужен Comparable?
contains() должен сравнивать элементы. Но ты снова прав. Отредактировано с лучшим выбором. ;)
Поиск «короче» в программировании — первая ошибка. Вы всегда должны искать «читабельнее» или «проще», а не «короче».