고차함수

  • 고차함수는 클로져와 같이 쓰인다.

forEach(_:)

  • 기본적으로 for - in 루프와 같은 동작을 한다.
    • break, continue 같은 플로우 컨트롤은 할 수 없음.
    • 모든 요소를 순회한다.
    • 클로저 내부에 return 키워드를 쓰더라도 해당 클로저만 종료 될 뿐 순회가 종료되지 않는다.
  • 뒤에 붙는 클로저 구문을 각 요소를 탐색할때마다 call한다.
  • 아래와 같이 두번 중첩해서 쓰는 것도 가능함.
stackView.arrangedSubviews.forEach { smallStackView in
            let stackView = smallStackView as? UIStackView
            stackView?.arrangedSubviews.forEach { view in
                let label = view as? UILabel
                guard let text = label?.text, text != "" else { return }
                result.append(text)
            }
        }

map(_:)

  • 배열의 각 요소를 클로저로 가공하여 다시 배열의 형태로 돌려준다.

compactMap(_:) versus flatMap(_:)

  • 기본 동작은 map(_:)과 유사하다.
  • 기존 flatMap은 deprecated되고, compactMap으로 대체가 되었다.
  • compactMap은 클로저를 통하여 요소를 변환한 후 non-nil 값 만 배열에 담아 리턴해준다.
  • flatmap은 배열을 한차원 낮춰준다. nil값을 그대로 반환한다(바인딩 하지 않음).
  • 시간복잡도 : O(m + n), where n is the length of this sequence and m is the length of the result.
let array = [[1, 2], [3, 4], [5]]
flattenedArray = array.flatMap { $0 }

/// flattendedArray = [1, 2, 3, 4, 5]

filter(_:)

  • 배열의 각 요소가 클로저의 조건을 통과 했을 때만 새로 만들어지는 배열에 넣어서 돌려준다.
  • 클로저 내부가 bool을 리턴 해 줘야 한다.
  • 시간복잡도 : O(n), where n is the length of the sequence

reduce(_:_:)

  • 정의가 조금 복잡하다.
func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, 
    Element) throws -> Result) rethrows -> Result
  • 다른 고차함수와 다르게 필요한 parameter가 2개이다. (initialResult, nextPartialResult)
  • initialReuslt는 클로저가 한번 돌때마다 값이 축적된다.
  • 배열을 순회하며 결과를 축적시켜 최종 단일 결과값을 리턴하게 된다.
  • 배열의 요소가 없다면 initialResult가 바로 결과값으로 나온다.
  • 시간복잡도 : O(n), where n is the length of the sequence

Reference

  • 애플 공식문서

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

[Swift Language Guide] String & Character  (0) 2022.09.19
[Swift] COW(Copy-on-Write)  (0) 2022.08.24