Dev/Swift

Swift: 클로저(Closure)

두넌 2023. 5. 14.

DAY 11

클로저(Closure)

 

클로저 표현식


클로저란? 익명 함수

C, C++, Objective-C의 block

Java Lambda function

C# Delegates

 

클로저 표현식은 독립적인 코드 블록

func add(x: Int, y: Int) -> Int {
    return(x+y)
}
print(add(x:10, y:20))

let add1 = { (x: Int, y: Int) -> Int in
    return(x+y)
}
print(add1(10, 20))

 

클로저 표현식은 매개변수를 받거나, 값을 반환하도록 만들 수도 있음

{(<매개변수 이름>: <매개변수 타입>, ...) -> <반환 타입> in
    // 클로저 표현식 코드
}

 

후행 클로저(trailing closure)


클로저가 함수의 마지막 argument라면 마지막 매개변수 이름을 생략한 후 함수 소괄호 외부에 클로저를 구현

convenience init(title: String?, style:
 UIAlertAction.Style, handler: ((UIAlertAction) -> Void)? = nil)

// 일반 클로저 표현식
let removeAction = UIAlertAction(title: "제거", style: UIAlertAction.Style.destructive, handler:  {
     ACTION in self.lampImg.image = self.imgRemove
     self.isLampOn=false
})

// 후행 클로저 표현
let onAction = UIAlertAction(title: "On", style:
 UIAlertAction.Style.default) {
     ACTION in self.lampImg.image = self.imgOn
     self.isLampOn=true
 }

함수의 마지막 argument를 생략한 후 함수 소괄호 외부에 클로저를 구현하여 더 깔끔하게 표현할 수 있는 것을 볼 수 있었음

 

다양한 클로저 표현들


let add = {(val1: Int, val2: Int) -> Int in
    return val1 + val2
}
result = add(10, 20)

 

일반적인 function으로 표현

func math(x: Int, y: Int, cal: (Int, Int) -> Int) -> Int {
    return cal(x, y)
}
result = math(x: 10, y: 20, cal: add)

 

closure 표현


일반적인 closure

result = math(x: 10, y: 20, cal: {(val1: Int, val2: Int) -> Int in
    return val1 + val2
})

 

trailing closure

result = math(x: 10, y: 20) {(val1: Int, val2: Int) -> Int in
    return val1 + val2
}

 

리턴형 생략

당연히 Int형으로 반환할 것을 알고 있기 때문에, -> Int 를 생략하여도 자동으로 만들어 준다

result = math(x: 10, y: 20, cal: {(val1: Int, val2: Int) in
    return val1 + val2
})

 

trailing closure, 리턴형 생략

result = math(x: 10, y: 20) {(val1: Int, val2: Int) in
    return val1 + val2
}

 

매개변수 생략 및 단축인자(shorthand argument name) 사용

단축인자 $ 는 0부터 시작하며, 위치의 절대값으로 매개변수를 표현한다

result = math(x: 10, y: 20, cal: {
    return $0 + $1
})

 

trailing closure, 매개변수 생략 및 단축인자 사용

result = math(x: 10, y: 20) {
    return $0 + $1
}

 

return 생략, 매개변수 생략 및 단축인자 사용

클로저에 return 값이 있으면 마지막 줄을 리턴하므로 return 생략 가능

result = math(x: 10, y: 20, cal: {
    $0 + $1
})

 

trailing closure, return 생략, 매개변수 생략 및 단축인자 사용

result = math(x: 10, y: 20) { $0 + $1 }

댓글