콘텐츠로 건너뛰기

[야곰 Swift 프로그래밍] 13_클로저(Closures)

책 내용을 한 번에 이해하기가 어려워서 클로저 기본 내용은 야곰 유튜브 강의를 참고했다.

클로저 기본

  • 클로저는 일정 기능을 하는 코드를 하나의 블록으로 모아놓은 것
  • 스위프트의 클로저는 C언어나 Objective-C의 블록(Block) 또는 다른 프로그래밍 언어의 람다(Lamda)와 유사
  • 클로저는 변수나 상수가 선언된 위치에서 참조(reference)를 획득(capture)하고 저장할 수 있음. 이를 변수나 상수의 클로징(잠금)이라고 하며 클로저는 여기서 착안된 이름

클로저의 형태와 기본 사용 예시

{(매개변수 목록) -> 반환 타입 in
    실행 코드
}
// 함수를 사용한다면
func sumFunction(a: Int, b: Int) -> Int {
    return a + b
}
var sumResult: Int = sumFunction(a: 1, b: 1)
print(sumResult)

// 클로저를 사용한다면
var add: (Int, Int) -> Int = { (a: Int, b: Int) -> Int in
    return a + b
}
sumResult = add(2, 2)
print(sumResult)
// (Int, Int) -> Int 를 매개변수로 받는 함수 calculate에 클로저 add, subtract를 전달하여 함수 실행
func calculate (a: Int, b: Int, method: (Int, Int) -> Int) -> Int {
    return method(a, b)
}

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

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

var calculated: Int
calculated = calculate(a: 3, b: 3, method: add)
print("add: \(calculated)") // add: 6

calculated = calculate(a: 3, b:3, method: subtract)
print("subtract: \(calculated)") // subtract: 0

클로저 고급

– 후행 클로저, 반환타입 생략, 단축인자 이름, 암시적 반환 표현

후행 클로저(Trailing Closures)

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

반환 타입 생략(Inferring Type From Context)

// calculate 함수의 method 매개변수는 Int 타입을 반환할 것이라는 것을 컴파일러가 알기 때문에
// 굳이 클로저에서 반환타입을 명시해주지 않아도 됨
// 대신 in 키워드는 생략할 수 없음
result = calculate(a: 20, b: 20, method: {(left: Int, right: Int) in
    return left + right
})
print(result)

// 후행클로저와 함께 사용할수도 있음
result = calculate(a: 30, b: 30){(left: Int, right: Int) in
    return left + right
}
print(result)

단축 인자 이름(Shorthand Argument Names)

// 단축 인자 이름
// 클로저의 매개변수 이름이 불필요하다면 단축 인자 이름을 활용할 수 있음
// 단축 인자 이름은 클로저의 매개변수 순서대로 $0, $1...처럼 표현함
result = calculate(a: 40, b: 40, method: { return $0 + $1 })
print(result)

// 후행클로저와 함께 사용
result = calculate(a: 50, b: 50){ return $0 + $1 }
print(result)

암시적 반환 표현(Implicit Returns from Single-Expression Closures)

// 암시적 반환 표현
// 클로저가 반환하는 값이 있다면
// 클로저의 마지막 줄의 결과값은 암시적으로 반환값으로 취급됨
// return을 명시해줄 필요 없음
result = calculate(a: 60, b:60){$0 + $1}
print(result)