티스토리 뷰

Swift

Swift 5.1 ) Ordered Collection Diffing

Zedd0202 2019. 7. 6. 17:16
반응형


안녕하세요 :) Zedd입니다.

오늘 진짜!!!!!!! 덥네요...

더운날엔 모다..? 









Ordered Collection Diffing



제가 저번에 Swift 5.1 변경사항에 대해서 글을 썼는데요, Ordered Collection Diffing이게 빠졌더라구요. proposal의 마지막 커밋 메세지에 swift 5.1이 없어서 걍 넘어간듯 ㅎ


이 내용은 WWDC Advances in Foundation에 잠깐 소개되는데..이 세션은 한번 보는걸 추천!



자, 이 제안을 한마디로 말하면, 

표준 라이브러리에 collection type에 대해 diff/patching 기능뿐만 아니라, diff에 대한 interchange format(교환 형식?)을 추가했다...


....ㅋ

자 뭔소린지 1도 모르겠는데요, 간단한 예제를 살펴봅시다.



자, 이렇게 collection이 있다고 챠ㅕ봅시다.


더 보기쉽게 버ㅗ면 이렇게. 


자, 근데 곰이 새가 되고싶어요!!!!!!! BEAR가 BIRD가 되는걸 도와줘봅시다.



그림에서 볼 수 있듯이, 둘다 "B"와 "R"을 가지고 있죠. 

하지만 bear에는 "E", "A". bird에서는 "I", "D"를 가지고 있습니다.



BIRD에는 E와 A가 없잖아요? 새가 되기 위해 E와 A를 remove해줍시다.



이렇게요. 

그리고 BEAR가 가지지 못한..BIRD의 I와 R을 insert해줍시다.



응 새야~



자 근데 remove insert작업 개귀찮은데 ㅎ;

왜냐면 collection의 remove, insert는 다들 아시다시피 offset을 사용해서 하곤 하잖아요? 



이렇게요.


이러한 귀찮음을 알았던 애플.


Apple : Ordered Collection Diffing API를 사용하면 이 작업들이 개쉬워진다는 부분/!?!?!



처음보고 들었던 생각 : 아니 이게 된다고...?


두번째 든 생각 : 아니 이게 왜 되지...? 무슨 원리지..???


그렇다면 하나하나 파헤쳐봅시다.



difference메소드..

딱 보면 뭔가 차이를 리턴해주는애 같죠?

맞습니다..정의는....정의는..


"Returns the difference needed to produce this collection’s ordered elements from the given collection, using the given predicate as an equivalence test."



주어진 predicate(술어?)를 equivalence test(등가 테스트....)로서 사용하여, 주어진 collection으로부터 collection의 ordered elements를 생성하기 위해 필요한 difference를 리턴합니다.


ㅋ!!!!!!!!!ㅋㅋ...!!!!!!!! 등가테스트 ㅎ!!!!!!!?


아 요새 공부를 안해서 애플이 이런애들이라는걸 깜빡했단



요 difference메소드에 관해서 조금 더 알아야 되는 사실이 있는데요, 이 메소드는 element의 이동(move)를 유추(infer)하지 않습니다.

이동을 유추해야하는 경우, difference의 result에 inferringMoves()메[소드를 호출하세요.

Complexity: 최악의 성능은 O(N*M)입니다. N은 (this) collection의 count이고, M은 (other) collection의 count입니다.

collection이 더 많은 공통요소를 공유할 때, 더 빠른 실행을 기대할 수 있습니다.


복잡도 때문에 꼭 언급하고 넘어가고 싶었습니당.

자자..요 difference가 모하는앤지,..감이 안올수도 있고, 정확히 모르겠을텐데요, 한번 써봅시다.


지금은 이거 하나만 이해하고 넘어갑시다.



difference메소드를 호출하면 뭔가 지금은 모르겠지만 뭔가 차이가 리턴된다! 이 느낌만 가지면 됩니다. 

ㅇ위에서 말한 this collection이 위 코드에서 bird고, other가 bear입니다.


자 암튼 뭔가 차이가 지금 리턴된 상태고, 그게 diff라는 상수 안에 담겨있는 상태라는것만 압시다.


일단!!!!!! 그냥 출력해보겠ㄹ음ㅋ


...

뭔가..암튼 뭔가 길고 뭔가 있네요? 

diff도 collection이라서요. 한번 하나씩 출력해볼게요.



호ㅓ거거걱

이제야 좀 알아볼수 있는 뭔가가 나와따

remove 2개, insert 2개..이거 머에요. 아까 BEAR를 BIRD로 만들기 위해서 필요했던 작업이었죠? 


remove한다 offset 2에 있는 element A를.

remove한다 offset 1에 있는 element E를.


insert한다 offset 1에 I를.

insert한다 offset 3에 D를.


자 지금 remove, insert가 된게 아니라는점.. 그냥 차이를 가지고 있다는 겁니다. diff라는 상수가. 

자 그렇다면 



applying메소드의 역할이 뭔가 감이 오기시작하네요. 



Diff를 collection에 정말 적용허ㅏ는 그런 아이입니다. 리턴타입으로는 Array가 나오는군요. 

applying메소드도 복잡도를 살펴보면, O(N+C)입니다. N은 self.count이고, c는 메개변수에 포함된 변경횟수라고 해요.

applying의 내부가 어떻게 되어있는지는 잘 모르겠지만,..,?



아마 내부에서 이런 동작을 하겠죠? 잘 보시면 제가 bird를 1, 2, 3, 4로 바꿨습니다. 이럴때 최악의 시간복잡도가 난다는 거겠죠..? 왜냐면 공통 요소가 하나도 없으니깐

+ ) 아 물론 applying은 새로운 Array를 리턴하니, 원 bear를 변경하는 일은 없겠네요. 암튼 동작이 이렇게 되지 않을까? 만 봐주세요. 




그럼 여기서 드는 3번째 궁금증 


어따씀?


https://thoughtbot.com/blog/ordered-collection-diffing?utm_campaign=iOS%2BDev%2BWeekly&utm_source=iOS%2BDev%2BWeekly%2BIssue%2B405


여기를 참고하시면 ㅇ ㅏ.....!!!!! 하실거에요.

tableView, collectionView에서 유용하게 쓰일 수 있게 되겠군요..!



Advances in Foundation보면서 이 부분이 잘 이해가 안갔었는데 ㅎㅎㅎ 오늘 그래도 감은 잡은거 같아서 기분이 좋군여...


틀린점이 있다면 바로 댓글달아주세요!!

모두 즐거운 주말 보내세요 ~.~



반응형