![](/img/trans.png)
[英]Swift 3 - Filter and sort array of dictionaries, by dictionary values, with values from array
[英]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.