closure를 parameter로도 쓸 수 있음.
func travel(action: (String) -> Void) {
print("I'm getting ready to go.")
action("London")
print("I arrived")
}
travel { (place: String) in
print("I'm going to \(place) in my car")
}
()->Void에서 Void가 아닌 반환하고싶은 다른 어떤 형태의 데이터 타입으로 바꿔도 됨..
위의 함수에서 약간의 변형을 줘서 string 값을 반환하고싶다면 아래처럼 써주면 됨.
func travel (action: (String) -> String ) {
print(“I’m getting ready to go.”)
let description = action(“London”)
print(description)
print(“I arrived”)
}
travel { (place: String) -> String in
return “I’m going to \(place) in my car”
}
위 코드에서 travel을 부를 때 swift는 parameter의 데이터 타입을 알고있다. 따라서 아래처럼 쓸 수 있음.
travel { place -> String in
return “I’m going to \(place) in my car”
}
또한 swift는 반환할 데이터 타입도 알고있으며, 코드가 한 줄 이라면 그 코드가 반환할 코드인 것을 알고있음. 따라서 아래처럼 더 줄일 수 있음.
travel { place in
“I’m going to \(place) in my car”
}
또한 swift는 자동적으로 closure의 parameter 이름을 ‘$’을 이용해 제공해줌. 아래의 코드는 위와 같은 코드임.
travel {
“I’m going to \($0) in my car”
}
두 가지 parameter를 받을 때도 위와 동일. $을 이용하여 closure를 작성하는 경우에 앞의 parameter를 $0으로, 뒤의 parameter를 $1을 이용해 작성.
func travel (action: (String, Int) -> String ) {
print(“I’m getting ready to go.”)
let description = action(“London”, 60)
print(description)
print(“I arrived”)
}
travel {
“I’m going to \($0) at \($1)miles per hour”
}
return 하는 값을 closure로 줄 수도 있음.
func travel() -> (String) -> Void { return
{
print(“I’m going to \($0).”)
}
}
let result = travel()
result(“London”)
이때
let result = travel()(“London”)
으로 작성해도되지만 되도록이면 안쓰도록 해야함.
closure안에 값을 선언해서 쓰게되면 이후에 그 값이 필요없어져도 swift가 그 값을 capture하여 안에 남아있음.
func travel() -> (String) -> Void {
var counter = 1
return {
print(“\(counter). I’m going to \($0).”)
counter += 1
}
}
let result = travel()
result(“London”)
result(“London”)
위 처럼 result를 반복하게되면 counter의 값이 계속 늘어남.