요즘은 운전면허를 따느라 정신이 없다.
다행히도 이번주에 필기 및 장내기능은 한번에 합격했고,
다음주에 도로주행을 볼 예정이다. 이것도 한 번에 합격했으면 좋겠다.
처음 봤을때 무슨 개념인지 몰랐는데, 따로 서치해보니 클로저는 익명함수라고한다.
액션같은 개념인듯 했다. (람다함수~)
독특하게도, 이 익명함수를 매개변수로 받는 함수를 만들 수 있다.
그래서 더 헷갈렸던듯...ㅎㅎ
그냥 파라미터에 Int, String 넣는 것처럼 함수를 넣어준다고 생각하면 쉽다.
//클로저를 매개변수로 가지는 메소드 정의. completion이라는 클로저인것.
func sayHi(completion: () -> Void){
print("sayHi() called")
sleep(2)
completion()
}
//메소드 호출부 에서 이벤트 종료를 알 수 있다.
sayHi(completion: {
print("2초가 지났다. 1")
})
sayHi(){
print("2초가 지났다. 2")
}
sayHi{
print("2초가 지났다. 3")
}
//매개변수로서 데이터를 반환하는 클로저 선언
func sayHiWithName(completion: (String) -> Void){
print("sayHiWithName() called")
sleep(2)
completion("오늘도 빡코딩 하고 계신가요")
}
//호출
sayHiWithName(completion: { (comment: String) in
print("2초 뒤에 그가 말했다! comment:", comment)
})
sayHiWithName(completion: { comment in print("2초 뒤에 그가 말했다! comment:", comment)})
sayHiWithName{comment in print("2초 뒤에 그가 말했다! comment:", comment)}
sayHiWithName{print("2초 뒤에 그가 말했다! comment:\($0)")}
//클로저의 데이터가 여러개인 경우
func sayHiWithFullName(completion : (String, String) -> Void){
print("sayHiWithFullName() called")
sleep(2)
completion("a","b")
}
sayHiWithFullName(completion:{(first: String, second: String) in
print("첫번째: \(first), 두번째: \(second)")})
sayHiWithFullName(completion: { first, second in print("첫번째: \(first), 두번째: \(second)")})
sayHiWithFullName{print("첫번째: \($0), 두번째: \($1)")}
//만약에 매개변수 두개 중 하나라도 안 쓰고 싶은 경우 언더바 쓰기
sayHiWithFullName{_, second in print("두번째: \(second)")}
//클로저를 생략하고 싶은 경우?-> completion을 옵셔널로
func sayHiOptional(completion: (()-> Void)? = nil){ //옵셔널
print("sayHi() called")
sleep(2)
completion?() //옵셔널
}
sayHiOptional() //이벤트 출력 안하고싶다.
sayHiOptional(completion:{
print("hahahaha")
})
//클로저를 일반적인 함수로 표현할 경우
//(String) -> Void
func completion(userInput: String){
}
//(String, String) -> Void
func completion(first: String, second: String){
}
//(Int) -> String
func transform(number: Int) -> String{
return "숫자 :\(number)"
}
//collection mapping
var numbers:[Int] = [0,1,2,3,4,5]
//map => 해당 클로저를 적용
var transformedNumbers = numbers.map{aNumber
in return "숫자:\(aNumber)"}
var transformedNumbers2 = numbers.map{return "숫자: \($0)"}