고차함수
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
댓글을 사용할 수 없습니다.