我有一系列结构,如下所示:
struct minStruct {
var namn:String?
var imag:UIImage?
var rea:String?
var comp:String?
}
var structArr = [minStruct]()
如果我想从该数组中删除特定的结构,我可以这样做:
var oneStruct = minStruct(namn: "Name", imag: UIImage(named: "Image"), rea: "Something", comp: "Something")
if structArr.filter({$0.namn == oneStruct!.namn}).count > 0 {
structArr = structArr.filter({$0.namn != oneStruct!.namn})
}
但是,我想要做的是从structArr中删除一个结构数组。像这样:
structArr = [minStruct(namn: "Name", imag: UIImage(named: "Image"), rea: "Something", comp: "Something"), minStruct(namn: "secondName", imag: UIImage(named: "secondImage"), rea: "Something2", comp: "Something2"), minStruct(namn: "thirdName", imag: UIImage(named: "thirdImage"), rea: "Something3", comp: "Something3")]
var arrToDelete = [minStruct(namn: "Name", imag: UIImage(named: "Image"), rea: "Something", comp: "Something"), minStruct(namn: "secondName", imag: UIImage(named: "secondImage"), rea: "Something2", comp: "Something2")]
所以我想要做的是从arrStruct中删除arrToDelete中的所有项目。在此示例中,arrToDelete包含structArr包含的三个结构中的两个。我想删除这两个结构并保留arrToDelete不包含的结构。我希望我足够清楚!
答案 0 :(得分:3)
所以我们有结构。首先,让我们Hashable
struct Element: Hashable {
var name: String?
var image: UIImage?
var rea: String?
var comp: String?
var hashValue: Int { return name?.hashValue ?? image?.hashValue ?? rea.hashValue ?? comp.hashValue ?? 0 }
}
func ==(left:Element, right:Element) -> Bool {
return left.name == right.name && left.image == right.image && left.rea == right.rea && left.comp == right.comp
}
接下来我们有这两个数组
let elms : [Element] = [
Element(name:"a", image:nil, rea:nil, comp:nil),
Element(name:"b", image:nil, rea:nil, comp:nil),
Element(name:"c", image:nil, rea:nil, comp:nil)
]
let shouldBeRemoved: [Element] = [
Element(name:"b", image:nil, rea:nil, comp:nil),
Element(name:"c", image:nil, rea:nil, comp:nil)
]
如果您不关心原排序,您可以使用
let filtered = Array(Set(elms).subtract(shouldBeRemoved))
如果您 DO 关心原始排序
let shouldBeRemovedSet = Set(shouldBeRemoved)
let filtered = elms.filter { !shouldBeRemovedSet.contains($0) }
为什么我不写这个?
let filtered = elms.filter { !shouldBeRemoved.contains($0) }
以上一行是正确的解决方案。无论如何调用
contains
Array
通常较慢(通常需要执行n / 2次检查) 而不是在Set
上调用它(通常是一次检查)。
答案 1 :(得分:0)
由于某种原因,实际上不允许使用布尔逻辑对结构进行比较,因此甚至很难在结构数组中搜索项目或项目的索引。因此,例如,如果您想在结构数组中搜索特定的结构,然后将其删除:
首先,您需要转到结构文件并为其提供一个协议,该协议允许在boolean
逻辑中使用该结构,所以...
struct Persons: Equatable {
struct properties...
struct init....
}
然后,您可以使用诸如...的数组方法在数组中进行搜索。
firstIndex(of: theStructYourLookingFor)
lastIndex(of: _)
或任何其他与布尔相关的数组方法。
在Swift 4.0及更高版本中-2019年4月起可能是新的