본문 바로가기
🍎iOS프로그래밍/오늘의 공부

Swift 클로저(Closure) 후행 클로저(trailing Closure) / iOS프로그래밍

by 둥둥동동# 2021. 10. 1.
728x90

 

 

클로저(Closure) 후행 클로저(trailing Closure)

 

클로저

후행클로저 

예제코드

 

클로저(Closure)

 

클로저는 함수이름을 정의하지 않는 익명함수입니다 

자바나 코틀린의 람다함수와 비슷한 기능을합니다

 

아래의 예시로 일반함수와 클로저를 비교해 보겠습니다

 

 

func add(x:Int, y:Int-> Int{
    return x + y
}
let add1 = { (x:Int, y:Int-> Int in
    return x + y
}
//print(add1(x:10, y:20))//함수를 담은 변수는 레이블 불가
print(add1(10,20)) // 30
print(type(of:add1)) // (Int, Int) -> Int
print(add(x:10,y:20)) // 30
print(type(of:add)) // (Int, Int) -> Int
cs

클로저는 add함수와 다르게 func 키워드를 사용하지도 않고 이름이 붙지도 않습니다

일급객체 포스팅을 보셨다면 함수를 변수에 담을 수 있다는 것을 아실겁니다

함수 영역을 블럭으로 감싼 뒤 add1변수에 저장합니다

함수를 담은 변수는 사용할 때 레이블을 제외해야 사용할 수 있습니다

 

 

후행클로저(trailing Closure)

 

후행 클로저란 클로저를 매개변수로서 사용할 때 이용됩니다

단 클로저는 꼭 마지막 변수이어야만 합니다

 

 

아래 예시로 설명을 드러야 정확히 설명할 수 있을 것 같습니다

 

 

클로저 예시

 

 

let fast = {(val1:String, val2:String-> String in
    return val1 + "는 " + val2 + "보다 빠르다"
}
print(fast("토끼","거북이")) //토끼는 거북이보다 빠르다
 
let slow = {(val1:String, val2:String-> String in
    return val1 + "는 " + val2 + "보다 느리다"
}
print(slow("거북이""토끼"))//거북이는 토끼보다 느리다
 
func concatenate(x:String, y:String, concat: (String,String-> String->String{
    return concat(x,y)
}
var result3 = concatenate(x:"치타", y:"거북이", concat:fast)
var result4 = concatenate(x:"거북이", y:"치타", concat:slow)
print(result3)//치타는 거북이보다 빠르다
print(result4)//거북이는 치타보다 느리다
 
cs

-보다 빠르다'를 만들어내는 fast()

-보다 느리다'를 만들어내는 slow()

 

 

이 때 concatenate()함수는 (String,String) -> String 형 함수를 마지막 인자로 받습니다

일단 concatenate()의 concat에게 클로저방식으로 매개변수를 넣어보겠습니다

var result = concatenate(x:"나", y:"거북이", concat:{(val1:String, val2:String-> String in
    return val1 + "는 " + val2 + "보다 빠르다"
})
print(result)//나는 거북이보다 빠르다
 
cs

함수()안에 concat함수{}까지 들어가니 가독성이 많이 떨어집니다

아래는 후행 클로저방식으로 작성한 코드입니다

 

 

 

 

var result = concatenate(x:"나", y:"거북이") {(val1:String, val2:String-> String in
    return val1 + "는 " + val2 + "보다 빠르다"
}
print(result)//나는 거북이보다 빠르다
cs

마지막매개변수(클로저)와 나머지 매개변수를 분리시켜 작성합니다 

아까보다는 한결 나아졌지만 저는 아직까지 보기가 어렵습니다 한번 더 간략하게 해보겠습니다

 

 

 

 

 

var result = concatenate(x:"나", y:"거북이") {(val1:String, val2:Stringin
    return val1 + "는 " + val2 + "보다 빠르다"
}
print(result)//나는 거북이보다 빠르다
cs

클로저의 리턴 자료형을 생략했습니다

아마 변수,상수에서 타입추론을 하는 원리와 같다고 추측됩니다

여기서 한번 더 간략히 해보겠습니다

 

 

 

 

var result6 = concatenate(x:"나", y:"거북이"){
    return $0 + "는 " + $1+ "보다 빠르다"
}
print(result6)//나는 거북이보다 빠르다
cs

클로저의 매개변수까지 생략시켰습니다 매개변수를 지정할 땐 단축인자($0~)를 사용할 수 있습니다

여기에 마지막으로 한번 더 간략히 하겠습니다

 

 

 

 

 

var result6 = concatenate(x:"나", y:"거북이"){$0 + "는 " + $1+ "보다 빠르다"}
print(result6)//나는 거북이보다 빠르다
cs

return 키워드까지 생략시켜 보았습니다

처음 클로저보다 훨씬 간결한 코드가 완성되었습니다

 

 

너무 많은 생략은 코드의 직관성을 떨어뜨리니 적절하게 사용해야 합니다!

 

 

참고자료

 

iOS프로그래밍기초(21-2학기)한성현교수님 강의 내용

 

728x90
반응형

댓글