首页 > 解决方案 > 高效的 Swift 数组比较

问题描述

struct Area {
var name: String
var isSelected: Bool
}

我有两个清单:

我想做的是创建一个新的区域列表,其中包含两个列表中的项目,但是如果列表一中的元素在列表二中,我想将 isSelected 属性更新为 true。

我写了当前的方法,但它有缺陷且效率低下:

private func didGetCurrentUserSession(_ usersAreas: [Area]?, allAreas: [Area]){
        guard let usersAreas = usersAreas else {return}
        var newAreasList = [Area]()
        for area in allAreas {
            for userArea in usersAreas {
                if userArea.name == area.name {
                    newAreasList.append(Area(name: area.name, isSelected: true))
                    break
                }
            }
            newAreasList.append(Area(name: area.name, isSelected: false))
        }

        _loadingAreas.onNext(false)
        _areas.onNext(newAreasList)
    }

对此的任何帮助将不胜感激。宁愿通过使用非常 Swifty 的方法来实现这一点。

标签: arraysswiftperformanceprocessing-efficiency

解决方案


让我们获取用户区域的名称:

let userAreaNames = Set((usersAreas ?? []).map { $0.name })

绘制其他区域

let newAreas = allAreas.map { area in
   return Area(
       name: area.name,
       isSelected: userAreaNames.contains(area.name)
   )
}

推荐阅读