Swift/Swift 기본문법

Swift 기본 문법 - 15. Closure

728x90

15. 클로저

막상 ios개발을 해보니 생각 보다 엄청 많이쓰이는 문법이다.

단순하게 생각해서 그냥 익명함수로 생각하겠다. 얘는 파라미터로 함수를 주고 받을 때 많이 사용된다.

 

예를 들어 데이터를 fetch하는 함수가 있을 때, 데이터를 성공적으로 받았을 때 실행 시킬 함수를 @escaping으로 받는 경우가 있다.

@escaping은 그냥 callback 함수라 생각해도 될 것 같다.

@escaping을 파라미터로 받는 함수가 끝난후 실행될 함수.?

 

코드를 보면 이런거다.

func fetchUser(withUsername username: String, completion: @escaping(User) -> Void) {
        REF_USER_USERNAMES.child(username).observeSingleEvent(of: .value) { (snapshot) in
            guard let uid = snapshot.value as? String else { return }
            
            self.fetchUser(uid: uid, complecation: completion)
        }
    }

=> 설명해보면 firebase에서 user.uid 1234값으로 데이터를 호출하고 나서 하는 행위인데 completion 이놈이 콜백함수다. 

 

저기 @escaping 파라미터에 값을 전달해주려면 어떻게 해야할까? 이럴때 closure을 사용 할 수 있다.

{(user) in self.user = user} 이 부분이 익명함수, 즉 클로져다.

 UserService.shared.fetchUser(uid: uid) { (user) in
            self.user = user
        }

 

책을 보면 @escaping을 설명할 때 이런 예제가 있다

// 함수의 전달인자로 전달한 클로저가 함수 종료 후에 호출 될 때
// 클로저가 함수를 탈출 한다고 표현합니다.

// 파라미터로 전달된 클로저 -> 함수종료후에 호출 = 클로저가 함수를 탈출

// 비동기 작업을 하는 함수 종료후에 호출될 클로저 = 탈출 클로저

// 외부로 전달되어 외부에서 사용이 가능하다는가, 외부 변수에 저장되면
// @escaping 을 앞에 써줘야한다.
// 즉, 클로저가 return 될 때, 클로저가 외부 변수에 들어갈 때,


var completionHandlers: [() -> Void] = []

func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
    completionHandlers.append(completionHandler)
}


typealias VoidVoidClosure = () -> Void

let firstClosure: VoidVoidClosure = {
    print("Closure A")
}

let secondClousre: VoidVoidClosure = {
    print("Closure B")
}

// first와 second 매개변수 클로저는 함수의 반환 값으로 사용될 수 있으므로
// 탈출 클로저입니다.


func returnOneClosure(first: @escaping VoidVoidClosure, second: @escaping VoidVoidClosure, shouldReturnFirstClosure: Bool) -> VoidVoidClosure {
    
    return shouldReturnFirstClosure ? first : second
}

// 함수에서 반환한 클로저가 함수 외부의 상수에 저장되었다.
let returnedClosure: VoidVoidClosure = returnOneClosure(first: firstClosure
, second: secondClousre, shouldReturnFirstClosure: true)

returnedClosure() // Closure A

var closures: [VoidVoidClosure] = []

//closure 매개변수 클로저는 함수 외부의 변수에 저장 될 수 있으므로 탈출 클로저 입니다.
func appendClosure(closure: @escaping VoidVoidClosure) {
    closures.append(closure)
}


// 자동 클로저
// 대기중인 손님들입니다.
var customersInLine: [String] = ["YoangWha", "SangYong", "SungHun", "HaMi"]
print(customersInLine.count)

 

 

뭔가 책을 읽으면 이게 무슨소린가 싶다...

 

다른 블로그를 참고하자

 

Swift) 클로저(Closure) 정복하기(1/3) - 클로저, 누구냐 넌

안녕하세요 :) 소들입니다 으휴 저번 주도 쓸데없이 바빴어서 포스팅을 못했네용 나태한 저번주의 나를 반성하며.. 하암..🥱 음 전에 제가 Swift의 꽃이 Optional이라고 말한 적 있는데, Optional 만큼

babbab2.tistory.com

 

반응형