jay's devnote
  • README
  • 자료구조 & 알고리즘
    • 자료구조
    • 알고리즘
  • 디자인 패턴
    • 디자인 패턴 원칙, 요약, 분류
    • IS-A 와 HAS-A
    • 전략 패턴
    • 옵저버 패턴
    • 데코레이터 패턴
    • 팩토리 패턴
    • 싱글턴 패턴
    • 커맨드 패턴
    • 어댑터, 퍼사드 패턴
    • 템플릿 메소드 패턴
    • 반복자, 컴포지트 패턴
    • 상태 패턴
    • 프록시 패턴
    • 복합 패턴
  • WWDC
    • 2015, Building Better Apps with Value Types in Swift
    • 2015, Protocol-Oriented Programming in Swift
    • 2016, Understanding Swift Performance
    • 2016, Protocol and Value Oriented Programming in UIKit Apps
    • 2017, Engineering for Testability
    • 2018, High Performance Auto Layout
    • 2018, Testing Tips & Tricks
    • 2020, Advances in UICollectionView
    • 2020, Lists in UICollectionView
  • 패러다임
    • 객체지향 프로그래밍, SOLID 원칙
      • SRP, 단일 책임 원칙
      • OCP, 개방 폐쇄 원칙
      • LSP, 리스코프 치환 원칙
      • ISP, 인터페이스 분리 원칙
      • DIP, 의존성 역전 원칙
    • 만들면서 느껴보는 POP
    • Swift로 함수형 프로그래밍 시작하기
  • 아키텍쳐
    • ReactorKit
      • Pulse(EN)
      • Pulse(KR)
    • Coordinator Pattern
  • iOS
    • Safari로 웹뷰의 세션/쿠키 정보 확인하기
    • App Icon 동적으로 변경하기
    • WKDataDetectorTypes의 데이터 탐지
    • Xcode에서 메모리 누수 확인하기
    • 개발 인증서 관리하기
    • required init?(coder: NSCoder)
    • UIFontMetrics 와 UIFont.preferredFont
    • 제약조건을 줄여주는 UIStackView
    • UICollectionView.CellRegistration<Cell, Item>
  • Swift
    • Swift API Design Guidelines
    • 패턴 매칭
    • allSatisfy()
    • 생성자
    • 프로토콜의 동적 디스패치와 정적 디스패치
    • Swift 문법 정리
  • RxSwift
    • RxSwift 핸드북
    • Just, From, Of
    • withLatestFrom
  • SwiftUI
    • SwiftUI에서의 마크다운 문법
    • @State, @Binding
    • ObservableObject, @ObservedObject, @Published
    • @ObservedObject vs @StateObject
  • Git
    • Git gitignore
    • Github API Rate limit
    • GitKraken(깃크라켄) 활용하기
    • GitKraken으로 Git-flow 활용하기
  • Etc
    • Struct을 [String: Any]로 변환할 때, Encodable의 Extension을 사용 해야 하나요?
    • Podfile, Dependency Rule(SPM)
    • 맥으로 고정 IP 연결하는 방법
    • SwiftPlantUML으로 UML 다이어그램 쉽게 그리기
    • Playground 가 열리지 않는 오류 해결하기
    • CocoaPods 제거하기
  • Python
    • 파이썬과 스위프트 문법 비교
    • 파이썬과 스위프트 문법 요약
  • Firebase
    • Storage를 API처럼 사용해보기
    • RealTime Database를 API처럼 사용해보기
Powered by GitBook
On this page
  • for loop
  • filter
  • allSatisfy
  • Conclusion
  • Reference
  1. Swift

allSatisfy()

Previous패턴 매칭Next생성자

Last updated 2 years ago

작업을 하다보면, 특정 값들이 모두 true 조건인지 확인해야 할 때가 있습니다.

예를들면 아래와 같은 것들이 있겠네요.

1. 회원가입 화면의 login, password, password repeat 값이 모두 유효한지 2. 개인정보동의 값에서 필수/선택 값들을 유효하게 선택했는지

Swift 에서는 이런 경우에 사용할 수 있는 메소드를 지원합니다. 에서 제안되었고, Swift 4.2 버전부터 지원하고 있어요. 생각보다 간단하고 저희가 기존과 썼던 방법과 크게 다르지 않으니 바로 살펴보겠습니다.

allSatisfy(_:) Returns a Boolean value indicating whether every element of a sequence satisfies a given predicate.

func allSatisfy(_ predicate: (Self.Element) throws -> Bool) rethrows -> Bool

iOS 8.0+ iPadOS 8.0+ macOS 10.10+ Mac Catalyst 13.0+ tvOS 9.0+ watchOS 2.0+

문서에서는 위와 같이 설명하고 있는데요. 시퀀스의 모든 요소가 주어진 조건을 만족하는지의 여부에 따라 Bool 타입을 리턴해주고 있어요. 모두 만족하면 true, 그렇지 않다면 false 를 말하는 거겠죠? 코드를 볼게요.

지금 names 라는 시퀀스가 있고, 해당 시퀀스 내부의 값들의 길이가 모두 5 이상인 경우를 체크한다고 해보죠.

let names = ["Sofia", "Camilla", "Martina", "Mateo", "Nicolás"]

for loop

먼저 for문을 사용하는 경우입니다. 익숙하지만, 고차함수를 사용하면 왠지 더 축약할 수 있을 것 같아요.

//for loop
func allHaveAtLeastFive(_ names: [String]) -> Bool {
    for name in names {
        if name.count < 5 {
            return false
        }
    }
    return true
}

filter

고차함수인 filter를 사용하면 어떨까요 ? 2가지 방법을 적어봤는데, 둘 다 for문 보다는 훨씬 간결하죠. 체이닝하면서 바로 작업할 수 있구요.

let allHaveAtLeastFiveFilter1 = names.filter({ $0.count >= 5 }).count == names.count
let allHaveAtLeastFiveFilter2 = names.filter({ $0.count < 5 }).isEmpty

allSatisfy

그럼 allSatisfy 를 사용하면 어떨까요 ? filter보다도 코드의 길이가 약간 더 축약되네요.

let allHaveAtLeastFive = names.allSatisfy({ $0.count >= 5 })

이쯤되면 이런 생각을 하실 수 있어요. "아니 그럼 더 익숙한 filter를 쓰지 굳이 왜 allSatisfy를 써?" 라고 말이죠. 그런데, filter와 allSatisfy를 잘 보시면 묘하게 다르다는 것을 볼 수 있어요.

filter는 해당 조건을 만족하는 시퀀스를 리턴하죠. 그래서 allHaveAtLeastFiveFilter1 의 방법으로는 필터를 한 번 걸고 해당 시퀀스의 count 값이 주어진 name의 count 값과 같은지를 비교하는 연산이 추가됩니다. 또 다른 allHaveAtLeastFiveFilter2 의 방법은 isEmpty라는 속성으로 더 간단하지만, 주어진 제한 조건을 반대로 $0.count < 5 처럼 한번 꺾어주어야 된다는 단점이 있어요. 그만큼 가독성이 떨어진다는 얘기죠.

하지만, allSatisfy는 위에서 보신 것처럼 주어진 제한 조건을 그대로 읽을 수 있고, 코드도 더 간결하죠. 그래서 문서에 나와있는 것처럼 어떤 특정 시퀀스의 조건을 모두 만족하는 지를 판단할 때는 꽤나 유용하게 사용할 수 있어요.

Conclusion

  • Swift에서는 시퀀스의 모든 요소가 주어진 조건을 만족하는지의 여부를 판단하는 메소드로 allSatisfy를 지원합니다.

  • 기존의 for loop, filter, contain 등을 사용해도 되지만, allSatisfy가 연산, 가독성, 축약 부분에서 더 뛰어납니다.

Reference

allSatisfy
SE-0207
https://developer.apple.com/documentation/swift/array/allsatisfy(_:)
https://github.com/apple/swift-evolution/blob/master/proposals/0207-containsOnly.md