문서에서는 위와 같이 설명하고 있는데요. 시퀀스의 모든 요소가 주어진 조건을 만족하는지의 여부에 따라 Bool 타입을 리턴해주고 있어요. 모두 만족하면 true, 그렇지 않다면 false 를 말하는 거겠죠? 코드를 볼게요.
지금 names 라는 시퀀스가 있고, 해당 시퀀스 내부의 값들의 길이가 모두 5 이상인 경우를 체크한다고 해보죠.
let names = ["Sofia", "Camilla", "Martina", "Mateo", "Nicolás"]
for loop
먼저 for문을 사용하는 경우입니다. 익숙하지만, 고차함수를 사용하면 왠지 더 축약할 수 있을 것 같아요.
//for loopfuncallHaveAtLeastFive(_names: [String])->Bool{for name in names {if name.count<5{returnfalse}}returntrue}
filter
고차함수인 filter를 사용하면 어떨까요 ? 2가지 방법을 적어봤는데, 둘 다 for문 보다는 훨씬 간결하죠. 체이닝하면서 바로 작업할 수 있구요.
allSatisfy
그럼 allSatisfy 를 사용하면 어떨까요 ? filter보다도 코드의 길이가 약간 더 축약되네요.
이쯤되면 이런 생각을 하실 수 있어요. "아니 그럼 더 익숙한 filter를 쓰지 굳이 왜 allSatisfy를 써?" 라고 말이죠. 그런데, filter와 allSatisfy를 잘 보시면 묘하게 다르다는 것을 볼 수 있어요.
filter는 해당 조건을 만족하는 시퀀스를 리턴하죠. 그래서 allHaveAtLeastFiveFilter1 의 방법으로는 필터를 한 번 걸고 해당 시퀀스의 count 값이 주어진 name의 count 값과 같은지를 비교하는 연산이 추가됩니다. 또 다른 allHaveAtLeastFiveFilter2 의 방법은 isEmpty라는 속성으로 더 간단하지만, 주어진 제한 조건을 반대로 $0.count < 5 처럼 한번 꺾어주어야 된다는 단점이 있어요. 그만큼 가독성이 떨어진다는 얘기죠.
하지만, allSatisfy는 위에서 보신 것처럼 주어진 제한 조건을 그대로 읽을 수 있고, 코드도 더 간결하죠. 그래서 문서에 나와있는 것처럼 어떤 특정 시퀀스의 조건을 모두 만족하는 지를 판단할 때는 꽤나 유용하게 사용할 수 있어요.
Conclusion
Swift에서는 시퀀스의 모든 요소가 주어진 조건을 만족하는지의 여부를 판단하는 메소드로 allSatisfy를 지원합니다.
기존의 for loop, filter, contain 등을 사용해도 되지만, allSatisfy가 연산, 가독성, 축약 부분에서 더 뛰어납니다.