[Swift 기본 문법] closure

dora·2024년 3월 12일

Swift 기본 문법

목록 보기
5/12

무명함수 Ramda식과 비슷한 개념이라고 이해해도 되나 조금 다름.

코드의 블럭을 의미하며, 함수는 이름이 있는 일종의 클로저이다.
변수, 상수 등으로 저장, 전달 인자로 전달이 가능하다.

일반 함수

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

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

클로저(closure)

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

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

//함수는 일종의 클로저이기 때문에, 클로저 변수에 함수도 할당할 수 있다.
sum = sumFunction(a: b:)
sumResult = sum(1,2)

print(sumResult)

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

let add: (Int, Int) -> Int
add = {(a:Int, b: Int)->Int in
	return a + b
}

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

let divide: (Int, Int) -> Int
divide = {(a: Int, b: Int) -> Int in
	return a / b
}

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

var calculated: Int

calculated = calculate(a: 50, b: 10, method: add)
calculated = calculate(a: 50, b: 10, method: subtract)
calculated = calculate(a: 50, b: 10, method: divide)

후행 클로저

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

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

print(result)

반환 타입 생략

어떤 타입을 반환할 것인지는 컴파일러도 알기 때문에 굳이 클로저에서 명시해 주지 않아도 된다. 하지만 in 키워드는 생략할 수 없다

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

print(result)

//후행 클로저와 함께 사용할 수도 있다
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
}

//축약하지 않은 클로저 문법과 축약 후의 문법 비교
result = calculate(a: 10, b: 10, method: {(left: Int, right: Int) -> Int in
    return left + right
})

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

0개의 댓글