본문 바로가기

[Swift 5.1] 순서가 있는 콜렉션끼리 차이점 비교하기 (SE-0240)

기술적인 이야기/애플 플랫폼 개발 2019. 10. 15.
반응형

SE-0240 Ordered Collection Diffing 프로포절은 제목처럼 컬렉션끼리 비교해서 차이점을 얻기 위한 것으로 Swift 5.1에 구현되었습니다.

단순하게 말하자면 difference()라는 메서드가 Collection에 추가되었다라고도 볼 수 있겠네요.

일단 예제를 봅시다.

let alpha1 = ["a", "b", "c"]
let alpha2 = ["a", "c", "d"]
let diff = alpha1.difference(from: alpha2)
for d in diff {
    print(d)
}

.difference() 메서드를 이용해 두 컬렉션을 비교할 수 있습니다. 결과는 CollectionDifference라는 타입의 컬렉션으로 돌아오는데 데이터를 가지고 있는 enum 필드들이 들어있습니다.

위 예제의 경우 차이점을 구해서 print()를 이용해 인쇄를 했고 아래와 같은 결과를 얻었습니다.

remove(offset: 2, element: "d", associatedWith: nil)
insert(offset: 1, element: "b", associatedWith: nil)

내용을 해석하면 2번 인덱스의 "d" 엘리먼트가 삭제되었고 1번 인덱스에 "b" 엘리먼트를 추가해야 한다 이렇게 볼 수 있습니다.

따라서 위의 alpha1.difference(from: alpha2) 코드는 alpha2를 alpha1과 동일하게 바꾸려면 어떻게 해야 하는지를 구하는 메서드입니다.

실제로 차이점을 없애서 동일하게 만들려면 아래처럼 switch 문으로 처리하는 코드를 추가하면 되겠네요.

let alpha1 = ["a", "b", "c"]
var alpha2 = ["a", "c", "d"]
let diff = alpha1.difference(from: alpha2)
for d in diff {
    switch d {
    case .remove(let offset, _, _):
        alpha2.remove(at: offset)
    case .insert(let offset, let element, _):
        alpha2.insert(element, at: offset)
    }
}
alpha1 == alpha2    // true

와 정말 대단한 기능 같....기는 한데 사실 어디다 써먹어야 할지 아직 감은 안 옵니다. 언젠가 이런 것도 필요할 때도 있겠지요. 😁

728x90
반응형

댓글