티스토리 뷰

Tech/Swift

스위프트 removeAll과 filter비교

Ellie Kim 2019. 1. 10. 18:01

스위프트4.2 버전에서 나왔던 removeAll이랑 기존에 있던 filter는 비슷한 역할을 합니다.


removeAll(where: ) method that performs a high-performance, in-place filter for collections.

You give it closure condition to run, and it will strip out all objects that match the condition.


즉 removeAll(where: ) 메서드는 컬렉션에 대해서 고성능인 in-place filter를 수행합니다. 


클로저에 필요한 조건을 주고 조건에 일치하는 모든 객체들을 제거할 것입니다. 


여기서 in-place는 그 자리에서라는 의미로 removeAll을 하게 되면 그 자리에서 제거를 합니다. 


in-place filter라는 단어가 removeAll(where: ) 메서드를 가장 잘 나타내는 키워드 같습니다.





[사용하기]



1. removeAll



[Int]인 scores변수를 선언했습니다.


removeAll의 클로저에 원하는 상태 값을 입력합니다.


'83점을 지울래' 조건을 설정해줍니다.


그러면 $0가 83인 object는 제거됩니다.


여기서 scores를 상수인 let으로 선언하지 않은 이유는 in-place라 scores에 있는 83을 제거합니다.


즉 scores가 변경되기 때문에 let이 아닌 var을 사용해야 합니다.


그렇기 때문에 여분의 복사본을 만들지 않습니다.



2. filter



위와 같이 scores.filter { $0 != 83 } 이라 하지 않고 리턴 받을 배열을 받아줄 newScores을 선언해주었습니다.


그 이유는 filter는 복사본을 만들어 리턴합니다.


즉 83을 제외한 나머지를 새로 만들어 newScores에 넣어줍니다.




print 문을 찍어낸  scores와 newScores는 같은 값인 [226,11,42,124] 을 출력합니다.




위 두개는 비슷한 역할을 하지만 차이점 또한 존재합니다.



차이점 1 )


removeAll(where: )은 제거할 상태를 적습니다. 


예를 들어 83인 값을 제거할 거야. 


{ $0 == 83 }



filter()은 제거하지 않을 상태를 적습니다.  


예를 들어 83인 값을 제거할 거야.


{ $0 != 83 }



removeAll이 내가 무엇을 제거할지 표시하기 때문에  조금 더 직관적입니다.



차이점 2 )


removeAll(where: )은 그 자리에서 object를 제거하기 때문에 불필요한 복사를 피합니다.


filter()은 제거보단 걸러내는 느낌입니다. 상태에 맞게 걸러내 복사한 값을 배열로 리턴합니다.  




'Tech > Swift' 카테고리의 다른 글

Swift functions abs,assert,assertionFailure  (0) 2019.03.07
Swift - Array shuffle()  (2) 2019.02.13
스위프트 zip 사용하기  (0) 2019.01.02
스위프트 map , forEach  (0) 2018.12.22
스위프트 오버로드 오버라이딩  (0) 2018.12.19
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함