ν‹°μŠ€ν† λ¦¬ λ·°

μ•ˆλ…•ν•˜μ„Έμš”? λ„ˆκ΅¬λ¦¬μž…λ‹ˆλ‹€γ…Žγ…Ž

μ˜€λŠ˜μ€ closure에 λŒ€ν•΄μ„œ λ°°μ›Œλ³΄λ €κ³  ν•΄μš”!

 

Closure(ν΄λ‘œμ €)


ν΄λ‘œμ €λŠ” μ½”λ“œμ—μ„œ 주변에 전달과 μ‚¬μš©ν•  수 μžˆλŠ” 자체 ν¬ν•¨λœ κΈ°λŠ₯ λΈ”λŸ­μž…λ‹ˆλ‹€.

λ‹€λ₯Έ μ–Έμ–΄μ—μ„œλŠ” λžŒλ‹€μ™€ μœ μ‚¬ν•˜λ‹€κ³  ν•˜λ„€μš”.

 

μ—¬λŸ¬λΆ„ ν•¨μˆ˜ μ•„μ‹œμ£ ?

ν•¨μˆ˜λŠ” ν΄λ‘œμ €μ˜ μΌν™˜μ΄κ³  이름이 μžˆλŠ” ν΄λ‘œμ € μž…λ‹ˆλ‹€.

ν΄λ‘œμ €κ°€ μ½”λ“œ λΈ”λŸ­μ΄κ³  이름이 μžˆμœΌλ‹ˆ ν•¨μˆ˜μ˜ ν˜•νƒœμ™€ κ°™λ„€μš”

 

그럼 ν΄λ‘œμ €μ˜ κΈ°λ³Έ ν˜•νƒœλŠ” μ–΄λ–€κ²ƒμΌκΉŒμš”?

μ•„λž˜ 그림처럼 ꡬ성이 λ©λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°μ™€ λ¦¬ν„΄νƒ€μž… 선언이 λλ‚˜λ©΄ in을 κΈ°μ€€μœΌλ‘œ μ‹€ν–‰ μ½”λ“œκ°€ ꡬ뢄이 λ©λ‹ˆλ‹€.

ν•œλ²ˆ 예제λ₯Ό 톡해 μ•Œμ•„λ³΄λ„λ‘ ν• κ²Œμš”!

μ–΄λ–€ 예제λ₯Ό 닀뀄볼거냐...

λ¬Έμžμ—΄μ„ 담은 배열을 μ •λ ¬ν•˜λŠ” 것에 λŒ€ν•΄ ν•œλ²ˆ 해보도둝 ν• κ²Œμš”!

let cities = ["Seoul", "Incheon", "Busan", "Daegu", "Gwangju"]

func sortingCities(_ city1: String, _ city2: String) -> Bool {
    return city1 < city2
}
var sortedCities2 = cities.sorted(by: sortingCities)
// ["Busan", "Daegu", "Gwangju", "Incheon", "Seoul"]

λ¨Όμ € μ •λ ¬ν•˜λŠ” ν•¨μˆ˜λ‘œ ν‘œν˜„μ„ ν•˜λ©΄ μœ„μ²˜λŸΌ

ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜κ³  μ μš©ν•˜λŠ” ν˜•νƒœλ‘œ λ©λ‹ˆλ‹€.

 

그럼 이것을 ν΄λ‘œμ €λ‘œ μ μš©ν•΄ 보면 μ•„λž˜ 처럼 λ©λ‹ˆλ‹€.

let cities = ["Seoul", "Incheon", "Busan", "Daegu", "Gwangju"]

var sortedCities2 = cities.sorted(by: { (city1: String, city2: String) -> Bool in
    return city1 < city2
    
})

ν•¨μˆ˜κ°€ 있던 μžλ¦¬μ— ν΄λ‘œμ € ν˜•νƒœλ‘œ λ“€μ–΄κ°”μŠ΅λ‹ˆλ‹€.

 

이제 μ—¬κΈ°μ„œ μ—¬λŸ¬ ν•­λͺ©λ“€μ„ μƒλž΅ν•  수 μžˆλŠ”λ°μš” 

λ¨Όμ € νŒŒλΌλ―Έν„°μ˜ νƒ€μž…κ³Ό λ°˜ν™˜λ˜λŠ” κ°’μ˜ νƒ€μž…μ„ μœ μΆœν•  수 있기 λ•Œλ¬Έμ— νƒ€μž…μ„ μƒλž΅ν•  수 μžˆμ–΄μš”

그리고 μ§€κΈˆκ°™μ΄ 단일 ν΄λ‘œμ €μΌλ•ŒλŠ” return도 μƒλž΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 

μ•„λž˜μ²˜λŸΌμš”!

let cities = ["Seoul", "Incheon", "Busan", "Daegu", "Gwangju"]

var sortedCities2 = cities.sorted(by: { city1, city2 in
    city1 < city2  
})

μ΄λ²ˆμ—λŠ” 인자의 이름도 μƒλž΅ν•  수 μžˆλŠ”λ°μš”

$0, $1 μ΄λŸ°μ‹μœΌλ‘œμš”

예λ₯Ό λ“€μ–΄ $1κΉŒμ§€ ν‘œν˜„μ„ ν•˜λ©΄ 1이 κ°€μž₯ 높은 μˆ«μžμ΄λ―€λ‘œ μΈμžκ°€ 2개 μžˆλ‹€κ³  ν΄λ‘œμ €μ—μ„œ 인식을 ν•©λ‹ˆλ‹€.

λ°”λ‘œ μ΄λ ‡κ²Œμš”

let cities = ["Seoul", "Incheon", "Busan", "Daegu", "Gwangju"]

var sortedCities2 = cities.sorted(by: { $0 < $1 })

μ‹ κΈ°ν•˜μ£ ? 

ν•˜μ§€λ§Œ μƒλž΅λœ 만큼 μ½”λ“œλ₯Ό μ΄ν•΄ν•˜κΈ°μ— μ•½κ°„ μ–΄λ €μšΈ 수 μžˆμœΌλ‹ˆ μ£Όμ˜ν•  ν•„μš”κ°€ μžˆμ–΄ λ³΄μ΄λ„€μš”.

 

ν›„ν–‰ ν΄λ‘œμ €(Trailing Closures)


그런데 ν΄λ‘œμ €μ˜ μ‹€ν–‰μ½”λ“œκ°€ κΈΈμ–΄μ§ˆμˆ˜λ„ 있고 κ·ΈλŸ¬λ‹€ 보면 인자 뢀뢄이 κΈΈμ–΄μ§ˆ 수 μžˆλŠ”λ°μš”

μ΄λŸ΄λ•Œ ν΄λ‘œμ €λ₯Ό ν•¨μˆ˜ μΈμžμ΄μ§€λ§Œ ν•¨μˆ˜ 호좜의 μ†Œκ΄„ν˜Έ λ‹€μŒμ— μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이것을 λ°”λ‘œ ν›„ν–‰ ν΄λ‘œμ € λΌκ³  ν•©λ‹ˆλ‹€!

μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λŠ”μ§€ ν•œλ²ˆ λ³΄μ‹œμ£ !

var sortedCities2 = cities.sorted() { $0 < $1 }

λ°”λ‘œ μ΄λ ‡κ²Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ§μ”€λ“œλ¦°λŒ€λ‘œ 인자인 ν΄λ‘œμ €λ₯Ό λ’€λ‘œ 보내버렸죠?

μΈμžκ°€ μ§€κΈˆμ²˜λŸΌ ν΄λ‘œμ € 1개라면 sortedλ’€μ˜ μ†Œκ΄„ν˜Έλ„ μ œκ±°ν•  수 μžˆμŠ΅λ‹ˆλ‹€!!

 

λ§Œμ•½ μΈμžκ°€ 2개 이상이라면 μ–΄λ–»κ²Œ λ κΉŒμš”?

κ·Έλ ‡κ²Œ λœλ‹€λ©΄ 첫번째 ν›„ν–‰ ν΄λ‘œμ €μ˜ 인자 라벨을 μƒλž΅ν•˜κ³  남은 ν›„ν–‰ ν΄λ‘œμ €μ˜ 라벨은 ν‘œκΈ°ν•©λ‹ˆλ‹€.

이것도 무슨 말인지 λͺ¨λ₯΄μ‹œκ² μ£ ? μ˜ˆμ œλž‘ 보면 쒀더 μ΄ν•΄ν•˜μ‹œκΈ° μ‰¬μš°μ‹€κ±°μ—μš”!

사진 κ°€λŸ¬λ¦¬μ—μ„œ 사진 ν•˜λ‚˜λ₯Ό λΆˆλŸ¬μ˜€λŠ” ν•¨μˆ˜λ₯Ό κ°€μ§€κ³  μ„€λͺ…ν•΄λ³Όκ²Œμš”

func loadPicture(from server: Server, completion: (Picture) -> Void, onFailure: () -> Void) {
    if let picture = download("photo.jpg", from: server) {
        completion(picture)
    } else {
        onFailure()
    }
}

loadPicture(from: someServer) { picture in
    someView.currentPicture = picture
} onFailure: {
    print("Couldn't download the next picture.")
}

ν•¨μˆ˜ μ„ μ–Έ μ½”λ“œλ₯Ό λ³΄μ‹œλ©΄ ν΄λ‘œμ €κ°€ 2κ°œκ°€ 듀어간것을 λ³Ό 수 μžˆμ–΄μš”

κ·Έ μ•„λž˜μ— ν•¨μˆ˜λ₯Ό 직접 μ‚¬μš©ν•˜λŠ” μ½”λ“œμΈλ°μš”!!

사진을 뢈러였기 μ„±κ³΅ν•˜λ©΄ 뷰에 뿌렀주고 μ‹€νŒ¨ν•˜λ©΄ μ—λŸ¬λ₯Ό 좜λ ₯ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€!

첫 번째 ν΄λ‘œμ €μ˜ 라벨은 μƒλž΅ λ˜μ–΄μ„œ ν‘œν˜„λ˜μ—ˆκ³  두 번째 ν΄λ‘œμ €μ˜ 라벨은 κ·ΈλŒ€λ‘œ μ‚΄μ•„ μžˆλŠ” λͺ¨μŠ΅μ„ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

 

캑쳐값 (Capturing Values)


ν΄λ‘œμ €λ₯Ό μ‚¬μš©ν•˜λ©΄ μΊ‘μ³κ°’μ΄λΌλŠ” κ°œλ…μ΄ μžˆλŠ”λ°μš”!

κ·Έλƒ₯ λ§λŒ€λ‘œ 캑쳐된 κ°’μž…λ‹ˆλ‹€! κ·Έ μ‚¬μš© μ˜ˆμ‹œλ₯Ό μ½”λ“œλ₯Ό λ³΄λ©΄μ„œ μ•Œμ•„λ³Όκ²Œμš”!

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

let incrementByTen = makeIncrementer(forIncrement: 10)

incrementByTen()
// returns a value of 10
incrementByTen()
// returns a value of 20
incrementByTen()
// returns a value of 30

이 ν•¨μˆ˜λŠ” 쀑첩 ν•¨μˆ˜κ°€ ν¬ν•¨λ˜κ³  ()->Intλ₯Ό 즉, ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€

μ€‘μ²©ν•¨μˆ˜μΈ incrementer()λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄ runningTotal, amount값을 캑처λ₯Ό ν•˜μ—¬ ν•¨μˆ˜μ—μ„œ μ‚¬μš©ν•˜κ²Œ λ©λ‹ˆλ‹€.

이 ν•¨μˆ˜λ₯Ό 할당받은 incrementByTen μΈμŠ€ν„΄μŠ€κ°€ 호좜될 λ•Œ λ§ˆλ‹€ ν•¨μˆ˜κ°€ 계속 ν˜ΈμΆœλ˜λŠ”κ²ƒμ„ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

λ‘λ²ˆμ§Έ ν˜ΈμΆœμ„ ν•˜λ©΄ μƒˆλ‘­κ²Œ λΆ„λ¦¬λœ runningTotal λ³€μˆ˜μ— μ°Έμ‘° μ €μž₯λ©λ‹ˆλ‹€.

λ§Œμ•½ λ‹€λ₯Έ μΈμŠ€ν„΄μŠ€μ— ν•¨μˆ˜λ₯Ό λ‹€μ‹œ ν• λ‹Ήν•΄ μ€€λ‹€λ©΄ 이 μ°Έμ‘°λŠ” 사라지고 초기 값을 μ°Έμ‘°ν•˜κ²Œ λ κ²λ‹ˆλ‹€.

 

κ·Έλ ‡λ‹€λ©΄ incrementByTen을 λ‹€λ₯Έ μΈμŠ€ν„΄μŠ€μ— ν• λ‹Ήν•΄ μ£Όλ©΄ μ–΄λ–»κ²Œ λ κΉŒμš”?

λ°”λ‘œ μ΄μ „μ˜ κ³„μ‚°λ˜μ—ˆλ˜ 값을 λ°›μ•„ κ³„μ‚°ν•˜κ²Œ λ©λ‹ˆλ‹€.

이 κ²°κ³Όλ₯Ό 보아 ν΄λ‘œμ €λŠ” μ°Έμ‘°νƒ€μž…μΈκ²ƒμ„ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€!!

 

μ΄μŠ€μΌ€μ΄ν”„ ν΄λ‘œμ €(Escaping Closures)


μ΄λ²ˆμ—” μ΄μŠ€μΌ€μ΄ν•‘ ν΄λ‘œμ €μ— λŒ€ν•΄μ„œ λ³Όκ±°μ—μš”!

μƒλ‹Ήνžˆ μ€‘μš”ν•˜κ³  자주 μ‚¬μš©ν•˜λŠ” ν‘œν˜„μ΄λ‹ˆ μ§‘μ€‘ν•΄μ„œ λ³΄μ‹œλ©΄ μ’‹μ„κ²ƒκ°™μŠ΅λ‹ˆλ‹€!!

 

μ΄μŠ€μΌ€μ΄ν•‘ ν΄λ‘œμ €λŠ” ν•¨μˆ˜κ°€  λλ‚œ 뒀에 싀행이 λ˜λ„λ‘ ν•˜λŠ” κΈ°λŠ₯μΈλ°μš”!!

ν•¨μˆ˜κ°€ λλ‚œ 뒀에 싀행을 μ›ν•˜λŠ” νŒŒλΌλ―Έν„°μ— @escaping을 λΆ™μ—¬μ£Όλ©΄ λ©λ‹ˆλ‹€!!

또 ν΄λ‘œμ €κ°€ νƒˆμΆœν•  수 μžˆλŠ” 방법 쀑 ν•˜λ‚˜λŠ”ν•¨μˆ˜ λ°”κΉ₯에 μ •μ˜λœ λ³€μˆ˜μ— μ €μž₯λ˜λŠ” κ²ƒμž…λ‹ˆλ‹€

이 κΈ°λŠ₯은 비동기 μž‘μ—…μ„ ν•˜λŠ” ν•¨μˆ˜κ°€ μ’…λ£Œλ˜λ©΄ completion으둜 자주 μ‚¬μš©λ©λ‹ˆλ‹€!

μ½”λ“œλ₯Ό λ³΄λ©΄μ„œ ν•œλ²ˆ ν™•μΈν•΄λ³Όκ²Œμš”!

var completionHandlers: [() -> Void] = []
func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
    completionHandlers.append(completionHandler)
}

μœ„μ˜ μ½”λ“œκ°€ μžˆλŠ”λ° ν•¨μˆ˜ μ™ΈλΆ€μ˜ λ³€μˆ˜μ— μ €μž₯λ˜λŠ” 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

μ΄λŸ΄λ•Œ @escaping을 λ„£μ–΄μ£Όμ§€ μ•ŠμœΌλ©΄ 컴파일 μ‹œ μ—λŸ¬κ°€ λ‚  수 μžˆμ–΄μš”!

 

이 κΈ°λŠ₯을 μ‚¬μš©ν•  λ•Œ μ£Όμ˜ν•΄μ•Ό ν•  점이 μžˆλŠ”λ°μš”!

self λ₯Ό μ°Έμ‘°ν•˜λŠ” μ΄μŠ€μΌ€μ΄ν”„ ν΄λ‘œμ €μ€ self κ°€ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μ°Έμ‘°ν•˜λŠ” 경우 νŠΉλ³„ν•œ κ³ λ €κ°€ ν•„μš”ν•©λ‹ˆλ‹€.

이 뢀뢄은 κ°•ν•œ μ°Έμ‘° 사이클이 생기기 μ‰¬μš΄λ° 사이클에 λŒ€ν•΄ 곡뢀λ₯Ό 더 ν•˜κ³  곡뢀해 보도둝 ν• κ²Œμš”!

 

이번 μ‹œκ°„μ—λŠ” ν΄λ‘œμ €κ°€ μ–΄λ–€ 역할을 ν•˜λŠ”μ§€ μ•Œμ•„λ³΄μ•˜λŠ”λ°μš”

ν΄λ‘œμ €κ°€ λ­”μ§€, 그리고 μœ μš©ν•˜κ²Œ μ‚¬μš©λ  수 μžˆλŠ” μ΄μŠ€μΌ€μ΄ν”„ ν΄λ‘œμ €κΉŒμ§€ μ•Œμ•„λ³Ό 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

ν˜Ήμ‹œ λ‚΄μš©μ— λŒ€ν•΄ ν”Όλ“œλ°±μ΄ μžˆμœΌμ‹œλ‹€λ©΄ λŒ“κΈ€ λ‚¨κ²¨μ£Όμ„Έμš”!

μ–Έμ œλ‚˜ ν™˜μ˜μž…λ‹ˆλ‹€~~~γ…Žγ…Ž

 

κΈ€ μ½μ–΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€~~~~!

λŒ“κΈ€
곡지사항
μ΅œκ·Όμ— 올라온 κΈ€
μ΅œκ·Όμ— 달린 λŒ“κΈ€
Total
Today
Yesterday
링크
Β«   2026/03   Β»
일 μ›” ν™” 수 λͺ© 금 ν† 
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
κΈ€ 보관함