https://www.swiftbysundell.com/posts/the-power-of-key-paths-in-swift에서 영감을 받음 에서 모든 keyPath에서 단일성을 필터링 할 수있는보다 강력한 도구를 선언 할 수 있습니다. 복잡성에 대한 다양한 답변에 대한 Alexander의 의견 덕분에 아래 솔루션은 거의 최적이어야합니다.
비 돌연변이 솔루션
모든 keyPath에서 단일성을 필터링 할 수있는 기능으로 확장합니다.
extension RangeReplaceableCollection {
/// Returns a collection containing, in order, the first instances of
/// elements of the sequence that compare equally for the keyPath.
func unique<T: Hashable>(for keyPath: KeyPath<Element, T>) -> Self {
var unique = Set<T>()
return filter { unique.insert($0[keyPath: keyPath]).inserted }
}
}
참고 : 객체가 RangeReplaceableCollection을 준수하지 않지만 Sequence를 준수하는 경우이 추가 확장명을 사용할 수 있지만 반환 유형은 항상 배열입니다.
extension Sequence {
/// Returns an array containing, in order, the first instances of
/// elements of the sequence that compare equally for the keyPath.
func unique<T: Hashable>(for keyPath: KeyPath<Element, T>) -> [Element] {
var unique = Set<T>()
return filter { unique.insert($0[keyPath: keyPath]).inserted }
}
}
용법
질문에서와 같이 요소 자체에 대해 단일성을 원하면 keyPath를 사용하십시오 \.self
.
let a = [1, 4, 2, 2, 6, 24, 15, 2, 60, 15, 6]
let b = a.unique(for: \.self)
/* b is [1, 4, 2, 6, 24, 15, 60] */
다른 id
객체 (예 : 객체 모음)에 대해 단일성을 원하면 선택한 keyPath를 사용합니다.
let a = [CGPoint(x: 1, y: 1), CGPoint(x: 2, y: 1), CGPoint(x: 1, y: 2)]
let b = a.unique(for: \.y)
/* b is [{x 1 y 1}, {x 1 y 2}] */
돌연변이 솔루션
모든 keyPath에서 단일성을 필터링 할 수있는 변경 기능으로 확장됩니다.
extension RangeReplaceableCollection {
/// Keeps only, in order, the first instances of
/// elements of the collection that compare equally for the keyPath.
mutating func uniqueInPlace<T: Hashable>(for keyPath: KeyPath<Element, T>) {
var unique = Set<T>()
removeAll { !unique.insert($0[keyPath: keyPath]).inserted }
}
}
용법
질문에서와 같이 요소 자체에 대해 단일성을 원하면 keyPath를 사용하십시오 \.self
.
var a = [1, 4, 2, 2, 6, 24, 15, 2, 60, 15, 6]
a.uniqueInPlace(for: \.self)
/* a is [1, 4, 2, 6, 24, 15, 60] */
다른 id
객체 (예 : 객체 모음)에 대해 단일성을 원하면 선택한 keyPath를 사용합니다.
var a = [CGPoint(x: 1, y: 1), CGPoint(x: 2, y: 1), CGPoint(x: 1, y: 2)]
a.uniqueInPlace(for: \.y)
/* a is [{x 1 y 1}, {x 1 y 2}] */
NSSet
. NSSet은 NSOrderedSet 순서를 유지해야하는 경우 정렬되지 않은 객체 모음입니다.