클로저(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:String) in
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학기)한성현교수님 강의 내용
'🍎iOS프로그래밍 > 오늘의 공부' 카테고리의 다른 글
Swift의 메서드 [Instance method, type/class method] / iOS프로그래밍 (0) | 2021.10.02 |
---|---|
Swift의 프로퍼티 [Stored property, computed property] / iOS프로그래밍 (0) | 2021.10.01 |
Swift 일급객체(First-class object) 일급시민(First-class citizen) / iOS프로그래밍 (0) | 2021.10.01 |
Swift의 함수 형태 및 사용 / iOS프로그래밍 (0) | 2021.09.26 |
Swift의 반복문,제어문(if문, for문, repeat-whlie문 ,guard문, switch-case문) / iOS프로그래밍 (0) | 2021.09.26 |
댓글