【问题标题】:Chaining filter and map array by dictionary values in Swift在 Swift 中通过字典值链接过滤器和映射数组
【发布时间】:2020-10-11 06:14:03
【问题描述】:

如何使用这种类型的链接

let numbers = [20,17,35,4,12]
let evenSquares = numbers.filter{$0 % 2 == 0}.map{$0 * $0}

在这种情况下

我有对象数组,我想通过外部字典的键对其进行过滤,然后将对象 id = 字典键的字典的过滤对象值分配给这些过滤对象,然后按字典值对结果对象进行排序

这是我现在拥有的代码:

let scoreDict: [String: Double]
var objects: [Object]
var filteredObjects = objects.filter { scoreDict.keys.contains.contains($0.id.uuidString.lowercased()) }
// .. and what next?
var scoresAssigned = filteredObjects.map { $0.score = scoreDict[$0.id.uuidString.lowercased()] } // This do not compile ""Cannot assign to property: '$0' is immutable"

【问题讨论】:

    标签: arrays swift dictionary filter


    【解决方案1】:

    假设Object 是struct,基于错误消息...

    这只是表明不应该在任何地方使用高阶函数。 map 将序列中的每个元素转换为其他元素。因此,您需要返回一个更改了 score 的新 Object,而不是分配 score。

    var scoresAssigned = filteredObjects.map { $0.withScore(scoreDict[$0.id.uuidString.lowercased()]) }
    

    withScore 看起来像:

    func withScore(_ score: Int) -> Object {
        var copy = self
        copy.score = score
        return copy
    }
    

    但是,如果你只是想为分数分配一个新的值,我推荐一个简单的for循环。

    for i in 0..<filteredObjects.count {
        filteredObjects[i].score = scoreDict[$0.id.uuidString.lowercased()]
    }
    

    另请注意,您只需访问字典一次。如果为 nil,则密钥不存在。

    var filteredObjects = [Object]()
    for i in 0..<objects.count {
        if let score = scoreDict[$0.id.uuidString.lowercased()] {
            objects[i].score = score
            filteredObjects.append(objects[i])
        }
    }
    

    【讨论】:

    • 你忘记了withScore(_:)函数中的返回类型
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多