1. 클로저를 매개변수로
completion 이라는 클로저를 매개변수로 가지는 메소드 정의
() -> Void
▼ 같음 ▼
func completion() {
}
func sayHi(completion: () -> Void) {
print("sayHi() called")
sleep(2) // 2초 잠깐 멈추기
// completion 클로저 실행
completion()
}
메소드 호출부에서 이벤트 종료를 알 수 있다
1
sayHi(completion: {
print("2초가 지났다. 1")
})
2
sayHi() {
print("2초가 지났다. 2")
}
3
sayHi {
print("2초가 지났다. 3")
}
2. 데이터를 반환
매개변수로서 데이터를 반환하는 클로저
(String) -> Void
▼ 같음 ▼
func completion(userInput: String) {
-> 반환형이 없으므로 Void
}
func sayHiWithNme(completion: (String) -> Void) {
print("sayHiWithName() called")
sleep(2)
// 클로저를 실행과 동시에 데이터를 반환
completion("오늘도 빡코딩 하고 계신가요?")
}
1
sayHiWithNme(completion: { (comment: String) in
print("2초 뒤에 그가 말했다! comment: \(comment)")
})
2
sayHiWithNme(completion: { comment in
print("2초 뒤에 그가 말했다! comment: \(comment)")
})
3
sayHiWithNme { comment in
print("2초 뒤에 그가 말했다! comment: \(comment)")
}
4
sayHiWithNme {
print("2초 뒤에 그가 말했다! comment: \($0)")
}
3. 여러개의 데이터
매개변수로서 데이터를 여러개 반환하는 클로저
(String, String) -> Void)
▼ 같음 ▼
func completion(first: String, second: String) {
}
func sayHiWithFullNme(completion: (String, String) -> Void) {
print("sayHiWithFullNme() called")
sleep(2)
// 클로저를 실행과 동시에 데이터를 반환
completion("빡코딩", "만쥬")
}
1
sayHiWithFullNme { first, second in
print("첫번째: \(first), 두번째: \(second)")
}
2. first 생략 -> _ 로 표시
sayHiWithFullNme { _, second in
print("두번째: \(second)")
}
3
sayHiWithFullNme {
print("첫번째: \($0), 두번째: \($1)")
}
4. 클로저를 옵셔널로
컴플리션이라는 이벤트를 받기 싫을 때는 컴플리션이라는 클로저 자체를 옵셔널로 만들면 된다.
옵셔널이 있을수도 있고, 없을수도 있다
(() -> Void)? = nil
기본형은 없는 것이 기본
func sayHiOptional(completion: (() -> Void)? = nil) {
print("sayHiOptional() called")
sleep(2)
// completion 클로저 실행
completion?()
}
1. 컴플레이션 필수로 나옴
sayHiOptional {
}
2. 이벤트 발생하지 않음
sayHiOptional()
3. 이벤트 받음
sayHiOptional(completion: {
print("2초가 지났다. !!")
})
5. 변환
(Int) -> String
▼ 같음 ▼
func transform(number: Int) -> String {
return "숫자 : \(number)"
}
// 배열
var myNumbers : [Int] = [0, 1, 2, 3, 4, 5]
1
var transformNumbers = myNumbers.map { (aNumber: Int) -> String in
return "숫자: \(aNumber)"
}
2
var transformNumbers = myNumbers.map { aNumber in
return "숫자: \(aNumber)"
}
3
var transformNumbers = myNumbers.map {
return "숫자: \($0)"
}
반응형