[Day 6] [Day 7]
@ Day 6
# 클로저
let driving = {
print("I'm driving in my car")
}
driving()
매개변수만 있는 클로저
- 클로저 호출 시에는 매개변수 이름 생략
in
으로 매개변수와 body 구분
let driving = { (place: String, vehicle: String) in
print("I'm going to \(place) by \(vehicle)")
}
driving("London", "car")
리턴 값만 있는 클로저
let sayHello = { () -> String in
return "Hello"
}
print(sayHello())
매개변수와 리턴 값이 있는 클로저
let driving = { (place: String, vehicle: String) -> String in
return "I'm going to \(place) by \(vehicle)"
}
print(driving("London", "car"))
# 매개변수로써의 클로저
- 함수의 매개변수 자리에
name: (closureParmeterType) -> closureReturnType
형식으로 작성
let driving = {
print("I'm driving")
}
func travel(action: () -> Void) {
print("All set")
action()
print("Arrived")
}
travel(action: driving)
# Trailing closure syntax
- 함수의 마지막 매개변수가 클로저일 때
매개변수 이름을 생략
하고 괄호 내부에 클로저 매개변수를 선언
하는 방식으로 함수 호출 가능
func animate(duration: Double, animations: () -> Void) {
print("Starting a \(duration) second animation...")
animations()
}
animate(duration: 3) {
print("Fade out the image")
}
animate(duration: 3, animations: {
print("Fade out the image")
})
- 함수의 매개변수가 클로저 하나뿐일 때는 호출 시
()
도 생략 가능
func travel(action: () -> Void) {
print("All set")
action()
print("Arrived")
}
travel{
print("I'm driving")
}
@ Day 7
# 매개변수로써의 클로저 : 특수 케이스
매개변수를 갖는 클로저
func travel(action: (String) -> Void) {
print("Ready to go")
action("London")
print("Arrived")
}
travel { (place: String) in
print(I'm going to \(place) in my car")
}
- 클로저 매개변수를
$number
형태의 shorthand name으로 축약 가능
b/c : (클로저를 매개변수로 갖는) 함수에서 클로저의 매개변수와 리턴 값의 타입을 지정했으므로 타입 추론 가능
- 위의 코드를 아래와 같이 작성 가능
func travel(action: (String) -> Void) {
print("Ready to go")
action("London")
print("Arrived")
}
travel {
print(I'm going to \($0) in my car")
}
매개변수와 리턴 값을 갖는 클로저
func travel(action: (String) -> String) {
print("Ready to go")
let description = action("London")
print(description)
print("Arrived")
}
travel { (place: String) -> String in
return "I'm going to \(place) in my car"
}
# 복수의 매개변수를 갖는 클로저
func travel(action: (String, Int) -> String) {
print("Ready to go")
let description = action("London", 60)
print(description)
print("I arrived")
}
travel {
"I'm going to \($0) at \($1) miles per hour"
}
# 클로저를 리턴하는 함수
- 함수의 리턴 값을 쓰는 부분에
(closureParameterType...) -> (closureReturnType)
와 같이 작성해 클로저를 리턴하는 함수임을 표현
func travel() -> (String) -> Void {
return {
print(I'm going to \($0)")
}
}
let result = travel()
result("London")
# Capturing values
클로저 내부에서 외부 변수를 이용
하면 (해당 클로저를 호출한 함수가 종료되더라도) 해당 변수의 값이 보존
됨
func travel() -> (String) -> Void {
var counter = 1
return {
print("\(counter). I'm going to \($0)")
counter += 1
}
}
result("London")
result("London")
result("London")