클로저 고급

손호준·2022년 6월 13일
0

swift

목록 보기
10/12

다양한 클로저 표현

클로저는 다양한 모습으로 표현될 수 있음. 함수의 매개변수 마지막으로 전달되는 클로저는 후행클로저(trailing closure)로 함수 밖에 구현할 수 있음

컴파일러가 클로저의 타입을 유추할 수 있는 경우 매개변수, 반환 타입 생략 가능.

반환값이 있는 경우 암시적으로 클로저의 맨 마지막 줄은 return 키워드를 생략하더라도 반환값으로 취급

전달인자의 이름이 굳이 필요없고, 컴파일러가 타입을 유추할 수 있는 경우 단축 인자이름을 활용가능. 단축인자 이름은 클로저의 매개변수의 순서대로 $0, $1.. 처럼 표현

var result: Int

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

///후행 클로저
//클로저가 함수의 마지막 전달인자라면 마지막 매개변수 이름을 생략한 후 함수 소괄호 외부에 클로저를 구현할 수 있음.
result = calculate(a: 10, b: 10) { (left: Int, right: Int) ->Int in
	result left + right
}


///반환타입 생략
//calculate 함수의 method 매개변수는 Int 타입을 반환할 것이라는 사실을 컴파일러도 알기 때문에 굳이 클로저에 반환타입을 명시해주지 않아도 됨
//대신 in 키워드는 생략 불가

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

//후행 클로저와 함께 사용 가능
result = calculate(a: 10, b: 10) {(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
}


///암시적 반환 표현
//클로저가 반환하는 값이 있다면 클로저의 마지막 줄의 결과값은 return 키워드를 사용하지 않아도 암시적으로 반환값으로 취급.
result = calculate(a: 10, b: 10) {
	$0 + $1
}

//한줄로 표현 가능
result = calculate(a: 10, b: 10) { $0 + $1 }
//축약 전과 비교해 보자
result = calculate(a: 10, b: 10, method: { (left: Int, right: Int) -> Int in
	return left + right
})
profile
Rustacean🦀/Data engineer💻

0개의 댓글