공부한 것 꼭꼭 씹어먹기

closure 본문

Swift 기초

closure

젤라솜 2021. 11. 1. 20:55
반응형

클로저 : 코드에서 전달 및 사용할 수 있는 독립 기능 블록이며, 일급 객체의 역할을 할 수 있음

  • 일급객체 : 전달 인자로 보낼 수 있고, 변수/상수 등으로 저장하거나 전달할 수 있으며, 함수의 반환값이 될 수 있다
// 클로저 표현식 : 주로 익명함수를 쓴다
{ (매개 변수) -> 리턴 타입 in
	// 실행 구문
}

// 파라미터와 리턴타입이 없는 클로저 정의
let hello = { () -> () in
	print("hello")
}
// 클로저 호출
hello()

// 파라미터와 리턴타입이 있는 클로저 정의
let hello2 = { (name: String) -> String in
	return "Hello, \(name)"
}
// 클로저 호출
hello2(name: "Gunter") // 에러발생: 클로저에는 argument label이 없다. 위의 name은 그냥 파라미터 이름일뿐.
hello2("Gunter") // 이렇게 호출해야한다.

// 클로저를 함수의 전달인자로 전달하기
func doSomething(closure: () -> ()) {
	closure()
}
doSomething(closure: {()->() in
	print("hello")	
})
doSomething() {  // 이렇게 호출할 수도 있다. 
	print("hello2")  // 파라미터와 리턴타입이 없는 클로저를 호출할때는 클로저 헤더와 in 키워드 생략가능.
}
doSomething {  // 이렇게 호출할 수도 있다. 
	print("hello2") // 파라미터와 리턴타입이 없는 클로저를 하나만 호출할때는 ()도 생략가능.
}

// 클로저를 함수의 반환부로 사용하기
func doSomething2() -> () -> () {
	return { () -> () in
		print("hello4")
	}
}
doSomething2()()

// 다중 후행 클로저 문법 🐣 아직 잘 모르겠...
func doSomething3(success: ()->(), fail: ()->()) {
}

// 클로저 표현 간소화
func doSomething4(closure: (Int, Int, Int) -> Int) {
	closure(1,2,3)
}
doSomething4(closure: {(a,b,c) in
	return a+b+c  // 정석대로 클로저 호출
})
doSomething4(closure: {
	return $0+$1+$2  // 약식인수를 통해 매개변수(a,b,c) 이름을 생략하여 사용가능
})
doSometing4(closure: {
	$0+$1+$2  // 실행 구문에 단일 리턴값만 남으면 return 키워드도 생략 가능
})
doSometing4() {
	$0+$1+$2  // 후행 클로저 문법
}
doSometing4 {
	$0+$1+$2  // 파라미터에 단 하나의 클로저만 받는 경우 ()도 생략 가능
}
반응형

'Swift 기초' 카테고리의 다른 글

고차 함수  (0) 2021.11.01
try-catch  (0) 2021.10.31
옵셔널 체이닝  (0) 2021.10.30
extension  (0) 2021.10.30
protocol  (0) 2021.10.29
Comments