내일배움캠프 iOS

iOS) TIL #18 클로저 조금, 고차함수 (map, filter, reduce)

yjuni22 2024. 11. 13. 20:14

클로저  Closure 

이름이 없는 익명 함수
함수는 "1급 객체"로 취급 - 프로토콜도 마찬가지
- 변수에 할당가능, 함수호출 시 파라미터로 전달 가능, 함수에서 함수를 반환 가능

 

// 기존 함수의 형태
func add(a: Int, b: Int) -> Int {
    let result = a + b
    return result
}
// 클로저 형태 (이름을 없애고 필요없는 것들을 생략함)
{ (a, b) in
    let result = a + b
    return result
}

콜백함수 Callback Funtion

다른 함수의 인수(argument) 로 사용되는 함수
어떤 이벤트 후 호출되어지는 함수

 

다른 함수의 인풋으로 쓰여서 나중에 출력이 된다.

func doSomething(callback: () -> ()) {
    print("시작")
    print("중간")
    callback()
}

func printFinish() {
    print("끝")
}

doSomething(callback: printFinish)

-> 시작 중간 끝
// 클로저 사용  / 함수를 정의하면서 전달함, 이름이 필요없음, 자유로움
doSomething(callback: { () -> () in
    print("끝")
})
// 생략
doSomething(callback: { print("끝") })

 

클로저의 축약 과정

closure(param: { (str: String) in

               return str.count

}) 

--> closure { $0.count }

closure(param: { (str: String) in
    return str.count
})
// ↓ 파라미터의 타입 생략 ( 유추가능 )
closure(param: { str in
    return str.count
})
// ↓ 리턴 생략
closure(param: { str in
    str.count
})
// ↓ 파라미터 겹쳐서 축약
closure(param: {
    $0.count
})
// ↓ 후행 클로저 trailing closure
closure() {
    $0.count
}
// ↓ () 생략
closure { $0.count }

클로저의 캡처현상

클로저가 힙에 생길 때 필요한 외부변수의 주소를 계속 사용하기 위해 캡처
외부 변수를 지속적으로 사용하려고

더 공부 필요

단순 클로저 실행 = non-escaping

⭐️ @escaping

탈출을 한다

왜 필요할까?

함수를 더 오래 사용하려고

 

함수가 종료되어도 클로저가 존재하도록 함

( 어떤 함수의 내부에 존재하는 클로저를 외부 변수에 저장 )

 

@autocolsure

자동으로 클로저를 만들어줌

( 파라미터가 없는 클로저만 가능 )

잘 사용하지 않음, 가끔 UIKit에 있음

 

https://bbiguduk.gitbook.io/swift/language-guide-1/closures#escaping-closures

 

클로저 (Closures) | Swift

명명된 함수 생성없이 실행되는 코드 그룹입니다. 클로저 (Closures) 는 코드에서 주변에 전달과 사용할 수 있는 자체 포함된 기능 블럭입니다. Swift의 클로저는 다른 프로그래밍 언어에서 클로저,

bbiguduk.gitbook.io


고차함수 

map

야구게임 보완에서 다룸.

compactMap

map + 옵셔널 제거
옵셔널 타입의 배열일 경우 사용함

flatMap

배열안에 배열이 있는 경우 하나의 배열으로 만들어줌


filter

 

 

 

 


reduce

제거한다 ( 배열을 제거하고 하나의 값으로 만듦)

배열의 아이템을 결합해서 하나의 값으로 리턴

초기값이 필요함

array.reduce(초기값)

 


forEach

각각의 아이템을 활용, 특정 작업을 실행


 

 

출처) 앨런 Swift문법 마스터스쿨