簡體   English   中英

通過 Swift 中的字典值鏈接過濾器和 map 數組

[英]Chaining filter and map array by dictionary values in Swift

我怎樣才能使用這種類型的鏈接

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

在這樣的用例中

我有對象數組,我想通過外部字典的鍵對其進行過濾,然后將 object id = 字典鍵的字典值分配給那些過濾的對象值,然后按字典值對結果 object 進行排序

這是我現在擁有的代碼:

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"

假設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])
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM