λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
IOS🍎/iOS+Swift

[Swift] Closure에 λŒ€ν•΄ μ•Œμ•„λ΄…μ‹œλ‹€.

by Jouureee 2021. 4. 16.

μ˜€λŠ˜μ€ κ·Έλ™μ•ˆ 많이 μ“°μ˜€μ§€λ§Œ κ·Έλƒ₯ μ§€λ‚˜μΉœ closure에 λŒ€ν•΄ μ•Œμ•„λ³΄κ³ μž ν•œλ‹€.

 

μƒλž΅λœ ν‘œν˜„μ΄ λ§Žμ•„μ„œ 이게 ν•¨μˆ˜μΈκ°€? ν•˜κ³  의문이 λ“€λ•Œλ„ 많고 swift/IOS 초보 μΌλ•ŒλŠ” 많이 ν—·κ°ˆλ¦¬λŠ” κ°œλ…μΈκ±° κ°™λ‹€.

곡식 λ¬Έμ„œ(swift-closure)와 ν•¨κ»˜ μ •λ¦¬ν•˜λ‹€λ³΄λ©΄ 이제 μœ μš©ν•˜κ²Œ 잘 쓰겠지 !! 

 

Closureλž€?

읡λͺ… ν•¨μˆ˜ func으둜 μ„ μ–Έν•˜λŠ” 것이 μ•„λ‹Œ ν•¨μˆ˜λ₯Ό λ³€μˆ˜μ— μ„ μ–Έν•˜λŠ” ν˜•νƒœ

곡식 λ¬Έμ„œμ—λŠ” 

ν΄λ‘œμ €λŠ” μ–΄λ–€ μƒμˆ˜λ‚˜ λ³€μˆ˜μ˜ μ°Έμ‘°λ₯Ό 캑쳐(capture)ν•΄ μ €μž₯ν•  수 μžˆλ‹€. 라고 μ •μ˜ν•΄λ‘μ—ˆλ‹€. 이에 λŒ€ν•΄ μ•„λž˜μ—μ„œ μžμ„Έν•˜κ²Œ μ‚΄νŽ΄λ³΄μž

 

ν΄λ‘œμ €κ°€ κ°€μ§€λŠ” ν˜•νƒœλŠ” λ‹€μŒκ³Ό 같이 3가지닀

 

μ „μ—­ ν•¨μˆ˜ : 이름 O, 캑쳐 X

쀑첩 ν•¨μˆ˜ : 이름 O, 캑쳐 O

ν΄λ‘œμ € ν‘œν˜„ : 이름 X, κ²½λŸ‰ν™”λœ λ¬Έλ²•μœΌλ‘œ κ΄€λ ¨λœ λ¬Έλ§₯(Context)λ‘œλΆ€ν„° 값을 캑쳐 O

 

ν΄λ‘œμ € ν‘œν˜„μ€ 간결함을 μΆ”κ΅¬ν•œλ‹€! (κ·Έλž˜μ„œ μ•Œμ•„λ³΄κΈ° μ–΄λ €μš΄ κ±°μ˜€κ΅°)

μ΅œμ ν™”λ₯Ό μΆ”κ΅¬ν•˜λŠ”λ° μ•„λž˜μ™€ 같은 뢀뢄에 μžˆμ–΄μ„œ 함좕을 μΆ”κ΅¬ν•œλ‹€

 

 

  • λ¬Έλ§₯(context)μ—μ„œ 인자 νƒ€μž…(parameter type)κ³Ό λ°˜ν™˜ νƒ€μž…(return type)의 μΆ”λ‘ 
  • 단일 ν‘œν˜„ ν΄λ‘œμ €μ—μ„œμ˜ μ•”μ‹œμ  λ°˜ν™˜
  • μΆ•μ•½λœ 인자 이름
  • ν›„μœ„ ν΄λ‘œμ € 문법

μ •λ ¬ λ©”μ†Œλ“œ(Sorted Method)

swift ν‘œμ€€ 라이브러리 sorted(by:)의 by뢀뢄에 μ–΄λ–€μ‹μœΌλ‘œ μ •λ ¬ν•  건지 κΈ°μˆ ν•œ ν΄λ‘œμ €λ₯Ό λ„£μœΌλ©΄ κ·Έ λ°©λ²•λŒ€λ‘œ μ •λ ¬λœ 배열을 얻을 수 μžˆλ‹€. μ˜ˆμ‹œλ‘œ μ‚΄νŽ΄λ³΄μž

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]

 

 

ν΄λ‘œμ €λ₯Ό λ„£λŠ” 일반적인 방법은 ν•˜λ‚˜μ˜ ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄ λ„£λŠ”κ²ƒμ΄λ‹€.

func backward(_ s1: String, _ s2: String) -> Bool {
    return s1 > s2
}
var reversedNames = names.sorted(by: backward)
// reversedNames is equal to ["Ewa", "Daniella", "Chris", "Barry", "Alex"]

backward ν•¨μˆ˜λ₯Ό λ§Œλ“€κ³  sorted(by:) 뢀뢄에 λ³€μˆ˜μ²˜λŸΌ backward ν•¨μˆ˜λ₯Ό λ„£μ–΄ μ£Όμ—ˆλ‹€. 

 

λ‹€μ–‘ν•œ ν΄λ‘œμ €λ“€μ— λŒ€ν•΄μ„œλ„ μ•Œμ•„λ³΄κΈ° μœ„ν•΄ ν΄λ‘œμ €μ˜ ν‘œν˜„ 문법에 λŒ€ν•΄ μ‚΄νŽ΄λ³΄λ„λ‘ ν•˜μž

{ (parameters) -> return type in
    statements
}

 

이것이 ν΄λ‘œμ €μ˜ ν‘œν˜„ 문법이닀!!

parameter(인자)에 λŒ€ν•΄ μ²˜λ¦¬ν•  뢀뢄은  in 뒀에 μžˆλŠ” statement에 λ„£μ–΄μ£Όκ³  statementμ—μ„œ 처리λ₯Ό 끝낸 λ’€ returnν•˜λŠ” νƒ€μž…μ„ λͺ…μ‹œν•΄μ€€λ‹€. μ΄λ ‡κ²Œ ν•¨μˆ˜λ‘œ λ”°λ‘œ μ •μ˜λœ ν˜•νƒœκ°€ μ•„λ‹Œ 인자둜 λ“€μ–΄κ°€ μžˆλŠ” ν˜•νƒœμ˜ ν΄λ‘œμ €λ₯Ό 인라인 ν΄λ‘œμ €λΌ λΆ€λ₯Έλ‹€.

 

μ•žμ˜ backwardν•¨μˆ˜λŠ” λ‹€μŒκ³Ό 같이 쓰일 μˆ˜λ„ μžˆλ‹€.

 

reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in
    return s1 > s2
})

 

λ¬Έλ§₯μ—μ„œ νƒ€μž… μΆ”λ‘ 

μ—¬κΈ°μ„œλΆ€ν„° κΈ°λ³Έν˜•μ— λŒ€ν•œ 좕약이 μΌμ–΄λ‚œλ‹€. κΈ΄μž₯ν•΄μ•Ό ν•œλ‹€!

λ§Œμ•½ sorted(by:)μ—μ„œ 이미 (String, String) -> Bool νƒ€μž…μ˜ μΈμžκ°€ 듀어와야 ν•˜λŠ”μ§€ μ•ˆλ‹€λ©΄ ν΄λ‘œμ €μ—μ„œ 이 νƒ€μž…λ“€μ€ μƒλž΅ 될 수 μžˆλ‹€. 

 

reversedNames = names.sorted(by: { s1, s2 in return s1 > s2 } )

parameter와 return의 νƒ€μž…μ΄ μƒλž΅λœκ±Έ 확인 ν•  수 μžˆλ‹€.

 

단일 ν‘œν˜„ ν΄λ‘œμ €μ—μ„œμ˜ μ•”μ‹œμ  λ°˜ν™˜

λ§μ—μ„œ μ•Œ 수 μžˆλ“―μ΄ μ΄λ²ˆμ—λŠ” λ°˜ν™˜ kewordκ°€ μƒλž΅ 될 것이닀. return의 μœ„μΉ˜κ°€ μ •ν•΄μ Έ μžˆμœΌλ―€λ‘œ μƒλž΅ν•΄λ„ μ „ν˜€ λͺ¨ν˜Έν•΄μ§€μ§€ μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€. 

 

reversedNames = names.sorted(by: { s1, s2 in s1 > s2 } )

 

이름 인자 μΆ•μ•½

μ΄λ²ˆμ—λŠ” 인자 이름을 μΆ•μ•½ν•΄λ³Ό 것이닀.. μƒλž΅κΉŒμ§„ μ•„λ‹ˆκ³  μ΄λ¦„λ§Œ κ°„κ²°ν•œ μ΄λ¦„μœΌλ‘œ ν‘œν˜„ν•˜λŠ” 것이닀.

reversedNames = names.sorted(by: { $0 > $1 } )

$ ν‘œν˜„κ³Ό ν•¨κ»˜ 숫자둜 ν‘œν˜„ν–ˆλ‹€. μ œλ²• λ§Žμ€κ²Œ μƒλž΅λ˜μ–΄μ„œ 더 쀄일 수 없을 거라 생각할 것이닀.

 

ν•˜μ§€λ§Œ ν•œλ²ˆ 더 μžˆλ‹€ ν•˜ν•˜ 

 

μ—°μ‚°μž λ©”μ†Œλ“œ

reversedNames = names.sorted(by: >)

두λ‘₯ .. γ„· γ„· γ„· 

λ‚˜κ°™μ΄ 생각이 λ§Žμ€ μ‚¬λžŒλ“€μ€ λ‹€μ–‘ν•œ 해석을 ν•  μˆ˜λ„ μžˆμ„ 것 κ°™λ‹€λŠ” 생각이 λ“ λ‹€. λ„ˆλ¬΄ λ§Žμ€ μΆ•μ•½κ³Ό μƒλž΅μ€ ν˜‘μ—…κ³Ό μ½”λ“œ 리뷰에 μ•ˆ 쒋을 μˆ˜λ„ 쒋을 μˆ˜λ„ μžˆμœΌλ‹ˆ λ¬΄μž‘μ • λ‚¨λ°œμ μœΌλ‘œ μ‚¬μš©ν•΄μ„  μ•ˆλœλ‹€

 


 

ν›„μœ„ ν΄λ‘œμ € Trailing Closures

λ§Œμ•½ ν•¨μˆ˜μ˜ λ§ˆμ§€λ§‰ 인자둜 ν΄λ‘œμ €λ₯Ό λ„£κ³  κ·Έ ν΄λ‘œμ €κ°€ κΈΈλ‹€λ©΄ ν›„μœ„ ν΄λ‘œμ €λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€. 

μ˜ˆμ‹œλ‘œ μ‚΄νŽ΄λ³΄μž

func someFunctionThatTakesAClosure(closure: () -> Void) {
    // function body goes here
}

 

λ§Œμ•½ 이런 ν˜•νƒœμ˜ ν΄λ‘œμ €κ°€ μžˆλ‹€λ©΄ ν΄λ‘œμ €μ˜ 인자 κ°’ μž…λ ₯ λΆ€λΆ„ ( () ) κ³Ό λ°˜ν™˜ν˜• λΆ€λΆ„ ( -> λ’·λΆ€λΆ„)을 μƒλž΅ν•΄μ„œ 

 

someFunctionThatTakesAClosure(closure: {
    // closure's body goes here
})

λ˜λŠ” 

someFunctionThatTakesAClosure() { }

 μ΄λ ‡κ²Œ μ“Έ 수 μžˆλ‹€. 

 

μš°μ™€ 이것도 ν΄λ‘œμ €μ˜€κ΅¬λ‚˜ ..!!! λŒ€λ°• λŒ€λ°•

 

λ‹€λ₯Έ μ˜ˆμ œλ„ μ‚΄νŽ΄λ³΄μž

let digitNames = [
    0: "Zero", 1: "One", 2: "Two",   3: "Three", 4: "Four",
    5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine"
]

let numbers = [16, 58, 510]

let strings = numbers.map { (number) -> String in
    var number = number
    var output = ""
    repeat {
        output = digitNames[number % 10]! + output
        number /= 10
    } while number > 0
    return output
}
// let stringsλŠ” νƒ€μž… 좔둠에 μ˜ν•΄ 문자 λ°°μ—΄([String])νƒ€μž…μ„ κ°–μŠ΅λ‹ˆλ‹€.
// κ²°κ³ΌλŠ” μˆ«μžκ°€ 문자둜 바뀐 ["OneSix", "FiveEight", "FiveOneZero"]κ°€ λ©λ‹ˆλ‹€.

map ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄ 각 자리수λ₯Ό κ΅¬ν•΄μ„œ 문자둜 λ³€ν™˜ν•˜κ³  10으둜 λ‚˜λˆˆ λ’€ 자리수λ₯Ό λ°”κΏ” 문자둜 λ³€ν™˜ν•˜λŠ” 것을 λ°˜λ³΅ν•œλ‹€. numberλŠ” μƒμˆ˜μΈλ° ν΄λ‘œμ € μ•ˆμ—μ„œ var둜 μž¬μ •μ˜ν–ˆκΈ° λ•Œλ¬Έμ— 값이 λ³€ν™˜ κ°€λŠ₯ν•˜λ‹€.

 

 

 

κ°’ 캑쳐  Capturing Values

ν΄λ‘œμ €λŠ” νŠΉμ • λ¬Έλ§₯의 μƒμˆ˜λ‚˜ λ³€μˆ˜μ˜ 값을 캑쳐할 수 μžˆλ‹€. 

λ‹€μ‹œλ§ν•΄ 원본 값이 사라져도 클둜져의 bodyμ•ˆμ—μ„œ κ·Έ 값을 ν™œμš©ν•  수 μžˆλ‹€λŠ” 것.

Swiftμ—μ„œ 값을 캑쳐 ν•˜λŠ” κ°€μž₯ λ‹¨μˆœν•œ ν˜•νƒœλŠ” 쀑첩 ν•¨μˆ˜(nested function) λ₯Ό μ‚¬μš©ν•˜λŠ” 것인데 예제둜 μ‚΄νŽ΄λ³΄μž

 

func makeIncrementer(forIncrement amount: Int) -> () -> Int {
    var runningTotal = 0
    func incrementer() -> Int {
        runningTotal += amount
        return runningTotal
    }
    return incrementer
}

makeIncrementer ν•¨μˆ˜ μ•ˆ incrementer ν•¨μˆ˜κ°€ μ€‘μ²©λœ ꡬ쑰닀. μ΄λ•Œ ν΄λ‘œμ €κ°€ 쑰금 μ‹ κΈ°ν•˜κ²Œ 생겼닀.

 

(forIncrement amount: Int) -> () -> Int 쀑에 처음 -> λ₯Ό κΈ°μ€€μœΌλ‘œ μ•žμ˜ (forIncrement amount: Int) 뢀뢄이 인자 값이고 λ’€ () -> IntλŠ” λ°˜ν™˜ κ°’μž…λ‹ˆλ‹€. --> (forIncrement amount: Int) ->  //////  () -> Int μ΄λ ‡κ²Œ λŠμ–΄ 읽어야 ν•œλ‹€. 즉 λ°˜ν™˜ κ°’ 뢀뢄이 ν΄λ‘œμ €λ‹€!!

 

func incrementer() -> Int {
    runningTotal += amount
    return runningTotal
}

 

incrementer ν•¨μˆ˜λ§Œμ„ 보면 runningTotal와 amountκ°€ 캑쳐링 λ˜μ—ˆλ‹€κ³  ν‘œν˜„ν•œλ‹€.

makeIncrementer ν•¨μˆ˜ μ‹€ν–‰ μ‹œ () -> Int ν΄λ‘œμ €λ₯Ό λ°˜ν™˜ν•˜λŠ”λ° 이에 λŒ€ν•΄ incrementerν•¨μˆ˜κ°€ μ‹€ν–‰λ˜κ³  그에 λŒ€ν•œ λ©”μ†Œλ“œλ₯Ό λ°˜ν™˜ν•œλ‹€.

 

ν΄λ‘œμ €λŠ” μ°Έμ‘°νƒ€μž…μ΄λ―€λ‘œ ν•¨μˆ˜μ™€ ν΄λ‘œμ €λ₯Ό μƒμˆ˜λ‚˜ λ³€μˆ˜μ— ν• λ‹Ήν•  λ•Œ μ‹€μ œλ‘œλŠ” μƒμˆ˜μ™€ λ³€μˆ˜μ— ν•΄λ‹Ή ν•¨μˆ˜λ‚˜ ν΄λ‘œμ €μ˜ μ°Έμ‘°(reference)κ°€ ν• λ‹Ήλœλ‹€. κ·Έλž˜μ„œ λ§Œμ•½ ν•œ ν΄λ‘œμ €λ₯Ό 두 μƒμˆ˜λ‚˜ λ³€μˆ˜μ— ν• λ‹Ήν•˜λ©΄ κ·Έ 두 μƒμˆ˜λ‚˜ λ³€μˆ˜λŠ” 같은 ν΄λ‘œμ €λ₯Ό μ°Έμ‘°ν•˜κ²Œ λœλ‹€. ν•¨μˆ˜ 포인터λ₯Ό μ €μž₯ν•œλ‹€κ³  μƒκ°ν•˜μ‹œλ©΄ μ΄ν•΄ν•˜κΈ° μ‰¬μš°μ‹€ 것!! 

 


μ΄μŠ€μΌ€μ΄ν•‘ ν΄λ‘œμ € Escaping Closures

 

ν΄λ‘œμ €λ₯Ό ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„°λ‘œ 넣을 수 μžˆλŠ”λ°, ν•¨μˆ˜ λ°–(ν•¨μˆ˜κ°€ λλ‚˜κ³ )μ—μ„œ μ‹€ν–‰λ˜λŠ” ν΄λ‘œμ € 예λ₯Όλ“€μ–΄, λΉ„λ™κΈ°λ‘œ μ‹€ν–‰λ˜κ±°λ‚˜ completionHandler둜 μ‚¬μš©λ˜λŠ” ν΄λ‘œμ €λŠ” νŒŒλΌλ―Έν„° νƒ€μž… μ•žμ— @escapingμ΄λΌλŠ” ν‚€μ›Œλ“œλ₯Ό λͺ…μ‹œν•΄μ•Ό ν•œλ‹€.

 

var completionHandlers: [() -> Void] = []

func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {

completionHandlers.append(completionHandler)

}

μœ„ ν•¨μˆ˜μ—μ„œ 인자둜 μ „λ‹¬λœ completionHandlerλŠ” someFunctionWithEscapingClosure ν•¨μˆ˜κ°€ λλ‚˜κ³  λ‚˜μ€‘μ— 처리 λœλ‹€. λ§Œμ•½ ν•¨μˆ˜κ°€ λλ‚˜κ³  μ‹€ν–‰λ˜λŠ” ν΄λ‘œμ €μ— @escaping ν‚€μ›Œλ“œλ₯Ό 뢙이지 μ•ŠμœΌλ©΄ μ»΄νŒŒμΌμ‹œ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

@escaping λ₯Ό μ‚¬μš©ν•˜λŠ” ν΄λ‘œμ €μ—μ„œλŠ” selfλ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ–ΈκΈ‰ν•΄μ•Ό ν•©λ‹ˆλ‹€.

 

func someFunctionWithNonescapingClosure(closure: () -> Void) {

closure() // ν•¨μˆ˜ μ•ˆμ—μ„œ λλ‚˜λŠ” ν΄λ‘œμ €

}



class SomeClass {

var x = 10

func doSomething() {

someFunctionWithEscapingClosure { self.x = 100 } // λͺ…μ‹œμ μœΌλ‘œ selfλ₯Ό μ μ–΄μ€˜μ•Ό ν•©λ‹ˆλ‹€.

someFunctionWithNonescapingClosure { x = 200 }

}

}



let instance = SomeClass()

instance.doSomething()

print(instance.x)

// Prints "200"



completionHandlers.first?()

print(instance.x)

// Prints "100"

 


 

μžλ™ν΄λ‘œμ € Autoclosures

 

μžλ™ν΄λ‘œμ €λŠ” 인자 값이 μ—†μœΌλ©° νŠΉμ • ν‘œν˜„μ„ κ°μ‹Έμ„œ λ‹€λ₯Έ ν•¨μˆ˜μ— 전달 인자둜 μ‚¬μš©ν•  수 μžˆλŠ” ν΄λ‘œμ €μž…λ‹ˆλ‹€. μžλ™ν΄λ‘œμ €λŠ” ν΄λ‘œμ €λ₯Ό μ‹€ν–‰ν•˜κΈ° μ „κΉŒμ§€ μ‹€μ œ 싀행이 λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ 계산이 λ³΅μž‘ν•œ 연산을 ν•˜λŠ”λ° μœ μš©ν•©λ‹ˆλ‹€. μ™œλƒλ©΄ μ‹€μ œ 계산이 ν•„μš”ν•  λ•Œ 호좜되기 λ•Œλ¬Έμž…λ‹ˆλ‹€. 예제λ₯Ό λ³΄λ©΄μ„œ 무슨 λœ»μΈμ§€ μ•Œμ•„ λ³΄κ² μŠ΅λ‹ˆλ‹€.

var customersInLine = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]

print(customersInLine.count)

// Prints "5"



let customerProvider = { customersInLine.remove(at: 0) }

print(customersInLine.count)

// Prints "5"



print("Now serving \(customerProvider())!")

// Prints "Now serving Chris!"

print(customersInLine.count)

// Prints "4"

μœ„ 예제 μ½”λ“œλ₯Ό 보면 let customerProvider = { customersInLine.remove(at: 0) } 이 ν΄λ‘œμ € μ½”λ“œλ₯Ό μ§€λ‚¬μŒμ—λ„ λΆˆκ΅¬ν•˜κ³  customersInLine.count λŠ” 변함없이 5이닀.

그리고 κ·Έ ν΄λ‘œμ €λ₯Ό μ‹€ν–‰μ‹œν‚¨ print("Now serving \(customerProvider())!") 이후에야 λ°°μ—΄μ—μ„œ 값이 ν•˜λ‚˜ μ œκ±°λ˜μ–΄ λ°°μ—΄μ˜ μ›μ†Œ κ°œμˆ˜κ°€ 4둜 쀄어든닀. 이렇듯 μžλ™ ν΄λ‘œμ €λŠ” μ ν˜€μ§„ 라인 μˆœμ„œλŒ€λ‘œ λ°”λ‘œ μ‹€ν–‰λ˜μ§€ μ•Šκ³ , μ‹€μ œ μ‚¬μš©λ  λ•Œ 지연 호좜 λ˜λŠ” 방식이닀.

μžλ™ν΄λ‘œμ €λ₯Ό ν•¨μˆ˜μ˜ 인자 κ°’μœΌλ‘œ λ„£λŠ” μ˜ˆμ œλŠ” μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

 

// customersInLine is ["Alex", "Ewa", "Barry", "Daniella"]

func serve(customer customerProvider: () -> String) {

print("Now serving \(customerProvider())!")

}

serve(customer: { customersInLine.remove(at: 0) } )

// Prints "Now serving Alex!"

serveν•¨μˆ˜λŠ” 인자둜 () -> String) ν˜•, 즉 μΈμžκ°€ μ—†κ³ , String을 λ°˜ν™˜ν•˜λŠ” ν΄λ‘œμ €λ₯Ό λ°›λŠ”λ‹€.

 

μœ„ 예제λ₯Ό @autoclosureν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•΄μ„œ 보닀 κ°„κ²°ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆμ„ 것이닀.

μ•„λž˜ 예제λ₯Ό μ‚΄νŽ΄λ³΄μž

// customersInLine is ["Ewa", "Barry", "Daniella"]

func serve(customer customerProvider: @autoclosure () -> String) {

print("Now serving \(customerProvider())!")

}

serve(customer: customersInLine.remove(at: 0))

// Prints "Now serving Ewa!"

 μ΄ ν‚€μ›Œλ“œλ₯Ό λΆ™μž„μœΌλ‘œμ¨ 인자 값은 μžλ™μœΌλ‘œ ν΄λ‘œμ €λ‘œ λ³€ν™˜λœλ‹€. ν•¨μˆ˜μ˜ 인자 값을 넣을 λ•Œ ν΄λ‘œμ €κ°€ μ•„λ‹ˆλΌ ν΄λ‘œμ €κ°€ λ°˜ν™˜ν•˜λŠ” λ°˜ν™˜ κ°’κ³Ό μΌμΉ˜ν•˜λŠ” ν˜•μ˜ ν•¨μˆ˜λ₯Ό 인자둜 넣을 수 μžˆλ‹€. κ·Έλž˜μ„œ serve(customer: { customersInLine.remove(at: 0) } ) 이런 μ½”λ“œλ₯Ό @autoclosureν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν–ˆκΈ° λ•Œλ¬Έμ— serve(customer: customersInLine.remove(at: 0)) μ΄λ ‡κ²Œ {} 없이 μ‚¬μš©ν•  수 μžˆλŠ” 것이닀.

μ •λ¦¬ν•˜λ©΄ ν΄λ‘œμ € μΈμžμ— @autoclosureλ₯Ό μ„ μ–Έν•˜λ©΄ ν•¨μˆ˜κ°€ 이미 ν΄λ‘œμ € 인것을 μ•ŒκΈ° λ•Œλ¬Έμ— 리턴값 νƒ€μž…κ³Ό 같은 값을 넣어쀄 수 μžˆμŠ΅λ‹ˆλ‹€.

 

ν΄λ‘œμ €λŠ” μΆ•μ•½ν•˜λ €λŠ” νŠΉμ§• λ•Œλ¬Έμ— λ‹€μ–‘ν•œ ν‘œν˜„λ“€μ„ κ°€μ§€λŠ” κ²ƒμ²˜λŸΌ 보인닀. ν•˜λ‚˜ ν•˜λ‚˜ λ‹¨κ³„μ μœΌλ‘  μƒλž΅λ˜μ–΄ μ½”λ“œλ₯Ό 보아야 ν•˜μ§€λ§Œ 이 단계λ₯Ό μ•Œκ³  μžˆλ‹€λ©΄ ν΄λ‘œμ €μž„μ„ νŒŒμ•…ν•˜κ³  무슨 의미λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 것인지 νŒŒμ•…ν•  수 μžˆμ„ 것이닀!

 

이제 정리 ν–ˆμœΌλ‹ˆκΉŒ closureλž‘ 많이 μΉœν•΄μ§€λ„λ‘ πŸ‘πŸ‘

 

λŒ“κΈ€