我有一个带有“标签”(40行)的原始数组,其中的对象包含:
tag: String?
selected: Bool? (false)
然后我用原始数组中的“标签”创建一个新数组,让我们说5行。选择的地方是真的。
我现在想要使用匹配的标签在原始数组中更改selected = true。
这是我的赌注:
originalArray = originalArray.filter{ selectedTags.map({ $0.tag }).contains($0.tag) }.forEach({ $0.selected = true})
Cannot invoke 'forEach' with an argument list of type '(@noescape (TagViewModel) throws -> ())'
答案 0 :(得分:2)
我就是这样做的:
yourOriginalArray.forEach({
let tempItem = $0
if yourSelectedArray.contains( { return $0.tag == tempItem.tag } ) {
$0.selected = true
}
})
答案 1 :(得分:0)
我更喜欢@Breek的回答而且他在我还在键入我的答案时发布了,但无论如何它在这里!你可以这样做:
struct TagViewModel : Equatable {
var tag: String
var selected: Bool
init(tag: String, selected: Bool) {
self.tag = tag
self.selected = selected
}
}
func ==(lhs: TagViewModel, rhs: TagViewModel) -> Bool {
return lhs.tag == rhs.tag
}
var originalArray = [
TagViewModel(tag: "1", selected: false),
TagViewModel(tag: "2", selected: false),
TagViewModel(tag: "3", selected: false),
TagViewModel(tag: "4", selected: false),
TagViewModel(tag: "5", selected: false),
TagViewModel(tag: "6", selected: true),
TagViewModel(tag: "7", selected: false),
TagViewModel(tag: "8", selected: true),
TagViewModel(tag: "9", selected: false)
]
let newArray = [
TagViewModel(tag: "1", selected: true),
TagViewModel(tag: "2", selected: true),
TagViewModel(tag: "3", selected: true)
]
for tagViewModel in newArray {
if let index = originalArray.indexOf(tagViewModel) {
originalArray[index].selected = tagViewModel.selected
}
}
答案 2 :(得分:0)
您可以简单地执行以下操作:
originalArray = originalArray.map({ element in
let newArrayFiltered = newArray.filter({ $0.tag == element.tag })
return (newArrayFiltered.count > 0) ? (newArrayFiltered[0]) : (element)
})
虽然我喜欢@breek的回复:)