🦜 Swift

[Swift] 클로저

ji-hyun 2022. 11. 20. 01:57

클로저

클로저 == 함수.

다만, 함수는 이름이 있는 클로저이다.

 

{ (매개변수 목록) -> 반환타입 in
	실행코드
}

 

 

 

Parameter 와 ReturnType 이 있는 클로저

 

let closure = { (name: String) -> String in
    return "Hello, \(name)"
}


name은 Argument Label이 아니고, 오직 Parameter Name.

클로저를 호출할 때는 함수와 다르게 Argument Label 을 사용하지 않는다.

 

closure("jihyun")
closure(name: "jihyun")  //error!

 

 

 

또 다른 예시를 살펴보면 다음과 같다.

 

// 클로저의 사용
var sum: (Int, Int) -> Int = { (a: Int, b: Int) -> Int in
	return a + b
}

sumResult = sum(1, 2) // 3

 

 

 


다음과 같이 변수에 함수를 할당할 수 있듯이

 

func sumFunction(a: Int, b: Int) -> Int {
	return a + b
}

sumResult = sumFunction(a:b:)

 

 

 

클로저도 변수에 할당할 수 있다.

 

let add: (Int, Int) -> Int

add = {(a: Int, b: Int) => Int in 
	return a + b
} // add 에 클로저 할당

let substract: (Int, Int) -> Int

substract = {(a: Int, b: Int) -> Int in
	return a - b
}

 

 

 

 

다음과 같이 method 에 클로저를 할당해보자.

 

func calculate(a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
	return method(a, b)
}

 

아까 정의해뒀던 add 를 할당해주었다.

 

var calculated: Int
calculated = calculate(a: 50, b: 10, method: add)

 

 

 

 

 

다음과 같이 클로저를 선언하면서 할당하는 것도 가능하다!!

 

calculated = calculate(a: 50, b: 10, method: { (left: Int, right: Int) -> Int in
	reutrn left * right
})

 

 

 

 

 

후행 클로저

클로저가 함수의 마지막 전달인자라면 마지막 매개변수 이름을 생략한 후 함수 소괄호 외부에 클로저를 구현할 수 있다.

 

 

 

위에서 in 앞에 Int 는 생략할 수도 있다. (컴파일러가 이미 알고 있기 때문)

다만 in 은 생략할 수 없다.

 

 

 

result = calculate(a: 10, b: 20) { (left: Int, right: Int) in
	return left + right
}

 

이렇게도 써줄 수 있다.

 

 


단축인자

 

클로저의 매개변수 이름이 굳이 불필요하다면 단축 인자이름을 활용할 수 있다.

단축 인자이름은 클로저의 매개변수의 순서대로 $0, $1,.. 로 표현한다.

 

result = calculate(a: 10, b: 10, method: {
	return $0 + $1
}

 

 

 

 

당연히 단축인자도 후행 클로저로 쓸 수 있다.

 

result = calculate(a: 10, b: 10) {
	return $0 + $1
}

 

 

 

 

 

result = calculate(a: 10, b: 10) {
	$0 + $1
}

 

클로저가 반환하는 값이 있다면 마지막 줄의 결과물은 암시적으로 반환값으로 취급된다. 

(return 생략가능)

 

 

 

 

위를 

 

result = calculate(a: 10, b: 10) { $0 + $1 }

 

한 줄로 표현도 가능하다

 

 

 

 

'🦜 Swift' 카테고리의 다른 글

[Swift] 프로퍼티 감시자  (0) 2022.11.20
[Swift] 프로퍼티  (0) 2022.11.20
[Swift] 열거형  (0) 2022.11.19
[Swift] 클래스  (0) 2022.11.19
[Swift] 구조체  (0) 2022.11.19