[Swift] 클로저

선주·2022년 4월 1일
0

Swift

목록 보기
5/20

📌 클로저

클로저의 정의

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

같은 기능이어도 함수로 만들면

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

var sumResult: Int = sumFunction(a: 1, b: 2)
print(sumResult) // 3

클로저를 사용하면

var sum = { (a: Int, b: Int) -> Int in
	return a + b
}

sumResult = sum(1, 2)
print(sumResult) // 3

함수는 클로저의 일종이므로 sum 변수에는 당연히 함수도 할당할 수 있다.

sum = sumFunction(a:b:)
sumResult = sum(1, 2)
print(sumResult) // 3

전달인자로 사용된 클로저

클로저는 주로 함수의 전달인자로 사용된다.

// 상수에 클로저 'add' 저장
let add = { (a: Int, b: Int) -> Int in
    return a + b
}

// 상수에 클로저 'substract' 저장
let substract = { (a: Int, b: Int) -> Int in
    return a - b
}

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

// 함수 'calculate'의 전달인자에 상수 'add'에 저장되어 있는 클로저 전달
var calculated = calculate(a: 50, b: 10, method: add)
print(calculated) // 60

// 함수 'calculate'의 전달인자에 상수 'substract'에 저장되어 있는 클로저 전달
calculated = calculate(a: 50, b: 10, method: substract)
print(calculated) // 40

// 함수 'calculate'의 전달인자에 클로저 코드블럭을 바로 작성해 전달
calculated = calculate(a: 50, b: 10, method: { (left: Int, right: Int) -> Int in
	return left * right
})
print(calculated) // 500

후행 클로저

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

calculated = calculate(a: 10, b: 20) { (left: Int, right: Int) -> Int in
	return left * right
}
print(calculated) // 200

반환타입 생략

함수를 정의할 때 method를 이미 (Int, Int) -> Int형으로 정의해두었기 때문에 컴파일러도 method 매개변수가 Int 타입을 반환할 것이라는 사실을 알고 있다. 따라서 클로저에서 굳이 반환타입을 명시해줄 필요가 없다.

// 함수 'calculate'의 정의
func calculate (a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
    return method(a, b)
}

// 반환타입 생략
calculated = calculate(a: 10, b: 30, method: { (left: Int, right: Int) in
    return left * right
})
print(calculated) // 300

// 후행 클로저 + 반환타입 생략
calculated = calculate(a: 10, b: 40) { (left: Int, right: Int) in
	return left * right
}
print(calculated) // 400

단축 인자이름

위의 left, right같은 클로저의 매개변수 이름이 굳이 불필요하다면 단축 인자이름을 활용할 수 있다. 단축 인자이름은 클로저의 매개변수의 순서대로 $0, $1, ... 처럼 표현한다.

// 단축 인자이름
calculated = calculate(a: 10, b: 10, method: {
	return $0 + $1
})
print(calculated) // 20

// 후행 클로저 + 단축 인자이름
calculated = calculate(a: 10, b: 10) {
	return $0 + $1
}
print(calculated) // 20

암시적 반환 표현

클로저가 반환하는 값이 있다면, 클로저의 마지막 줄의 결과값은 return을 쓰지 않아도암시적으로 반환값으로 취급한다.

calculated = calculate(a: 10, b: 10) {
	$0 + $1
}
print(calculated) // 20

// 간결하게 한 줄로도 표현 가능
calculated = calculate(a: 10, b: 10) { $0 + $1 }


야곰의 스위프트 기본 문법 강좌를 수강하며 작성한 내용입니다.

profile
기록하는 개발자 👀

0개의 댓글