我有这个对象数组。每个对象都具有“ startPoint”属性,即“日期”。
现在,我想确保没有其他具有相同“ startPoint”的对象,而与其他属性的值无关。
因此,我发现了一种可能的方法,该方法适用于字符串,但不适用于日期:
var uniqueValues = Set<String>()
result = result.filter{ uniqueValues.insert("\($0.startPoint)").inserted}
你们当中有人能指出我正确的方向吗?
答案 0 :(得分:0)
使用日期组件来唯一设置日期,因此您可以忽略时间部分
struct Record {
let date: Date
let name: String
}
let now = Date()
let soon = Date(timeIntervalSinceNow: 100)
let future = Calendar.current.date(byAdding: .day, value: 1, to: now)!
let records = [Record(date: now, name: "Now"),
Record(date: soon, name: "Soon"), // same day so should be removed
Record(date: future, name: "Future")]
var unique = Set<DateComponents>()
let result = records.filter {
let comps = Calendar.current.dateComponents([.day, .month, .year], from: $0.date)
if unique.contains(comps) {
return false
}
unique.insert(comps)
return true
}
print(result)
// [Record(date: 2018-10-11 13:47:17 +0000, name: "Now"),
// Record(date: 2018-10-12 13:47:17 +0000, name: "Future")]
答案 1 :(得分:-1)
我的方法与其他答案类似,但是由于它使用Dictionary
而不是Array
,因此性能更高。不过,这是有代价的:您将失去使用Set
方法的订单。
struct MyObject {
let startPoint: Date
}
let values: [MyObject] = [...]
let unique = Array(
values.reduce(into: [Date: MyObject]()) { result, value in
result[value.startPoint] = result[value.startPoint] ?? value
}.values
)