查找索引的简短解决方案

时间:2019-01-29 10:33:46

标签: arrays swift

函数是从另一个数组中筛选出相等年份的索引。

我正在寻找代码的更短解决方案:

 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) }
        }
    }
 }

我尝试了一些解决方案,但它们看起来丑陋且比这更长。

谢谢。

5 个答案:

答案 0 :(得分:3)

有许多可能的解决方案,例如:

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)
}

答案 1 :(得分:2)

您可以直接过滤indices

years.indices.filter{ chosenYears.contains(years[$0]) }.forEach { view?.selectCell(at: $0) }

我完全同意苏尔坦的评论。但是,我会用 更有效率

代替更加可读更简单

答案 2 :(得分:1)

您可以使用以下函数查找任何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)

答案 3 :(得分:0)

尝试:

scoped-css-from-a-vue-file.03371a6565c9f56951dd.css // (172 bytes)
main-css-bundle-from-sass-files.af5152091d41a56d9bdd.css // (303 KiB)

答案 4 :(得分:0)

您可以尝试如下操作:

self.tableView.visibleCells
.flatMap { $0 as? MyCell }
.forEach { $0.updateView(isSelected: chosenYears.contains($0.viewModel?.year) }

尽管它要求单元格存储其表示年份的视图模型,但您需要实现updateView(isSelected:)