ν΄λ‘μ (Closures)
μ΄λ€ μμλ λ³μμ μ°Έμ‘°λ₯Ό μΊ‘μ²(κ°μ μ°Έμ‘°λ₯Ό κ°λλ€.)ν΄ μ μ₯ν μ μλ μ½λ λΈλ
Swiftλ κ΄λ ¨λ λ©λͺ¨λ¦¬λ₯Ό μμμ μ²λ¦¬
ν΄λ‘μ μ νν
- μ μ ν¨μ : μ΄λ¦μ΄ μκ³ μ΄λ€ κ°λ μΊ‘μ²νμ§ μλ ν΄λ‘μ
- μ€μ²© ν¨μ : μ΄λ¦μ΄ μκ³ κ΄λ ¨ν ν¨μ(νμ→μμ)λ‘ λΆν° κ°μ μΊ‘μ² ν μ μλ ν΄λ‘μ
- ν΄λ‘μ νν : κ²½λν λ λ¬Έλ²μΌλ‘ μ°μ¬μ§κ³ κ΄λ ¨λ λ¬Έλ§₯(context)μΌλ‘λΆν° κ°μ μΊ‘μ³ν μ μλ μ΄λ¦μ΄ μλ ν΄λ‘μ
ν΄λ‘μ νν (Closure Expressions)
μΈλΌμΈ ν΄λ‘μ λ₯Ό λͺ ννκ² νννλ λ°©λ²μΌλ‘ λ¬Έλ²μ μ΄μ μ΄ λ§μΆ°μ Έμμ
μ½λμ λͺ νμ±κ³Ό μλλ₯Ό μμ§ μμΌλ©΄μλ λ¬Έλ²μ μΆμ½ν΄ μ¬μ©ν μ μλ λ€μν λ¬Έλ²μ μ΅μ ν λ°©λ²μ μ 곡
μ λ ¬ λ©μλ(The Sorted Method)
Swift νμ€ λΌμ΄λΈλ¬λ¦¬μμ sorted(by:)λΌλ νμ μ λ°°μ΄ κ°μ μ λ ¬νλ λ©μλλ₯Ό μ 곡
byμ μ λ ¬ λ°©λ²μ μμ±ν ν΄λ‘μ λ₯Ό λ£μΌλ©΄ κ·Έ λ°©λ²λλ‘ μ λ ¬λ λ°°μ΄μ μ»μ μ μμ
sorted(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"]
ν΄λ‘μ νν λ¬Έλ² (Closure Expression Syntax)
ν΄λ‘μ νν λ¬Έλ² (μΌλ°)
{ (parameters) -> return type in
statements
}
reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in
return s1 > s2
})
- μΈλΌμΈ ν΄λ‘μ : ν¨μλ‘ λ°λ‘ μ μλ ννκ° μλ μΈμλ‘ λ€μ΄κ° μλ ννμ ν΄λ‘μ
λ¬Έλ§₯μμ νμ μΆλ‘ (Inferring Type From Context)
sorted(by:) μ λ©μλμμ (String, String) -> Bool νμ μ μΈμκ° λ€μ΄μμΌ νλκ±Έ μκΈ° λλ¬Έμ ν΄λ‘μ μμ μ΄ νμ λ€μ μλ΅ ν μ μμ
μ΄μ²λΌ νμ μ μμ±νμ§ μμλ νμ μ μΆλ‘ ν΄μ μ μμ μΌλ‘ ν΄λ‘μ κ° μνλ¨
reversedNames = names.sorted(by: { s1, s2 in return s1 > s2 } )
- νμ§λ§ κ°λ μ±κ³Ό μ½λμ λͺ¨νΈμ±μ νΌνκΈ° μν΄ νμ μ λͺ μνλκ±Έ κΆμ₯
λ¨μΌ νν ν΄λ‘μ μμμ μμμ λ°ν (Implicit Returns from Single-Express Closures)
λ¨μΌ νν ν΄λ‘μ μμλ λ°ν ν€μλ(return)λ₯Ό μλ΅ν μ μμ
reversedNames = names.sorted(by: { s1, s2 in s1 > s2 } ) // retrun μλ΅
μΈμ μ΄λ¦ μΆμ½ (Shorthand Arguments Names)
μΈλΌμΈ ν΄λ‘μ μ μλμΌλ‘ μΆμ½ μΈμ μ΄λ¦μ μ 곡
μΈμ κ°μ μμλλ‘ $0, $1, $2 λ±μΌλ‘ μ¬μ©κ°λ₯
μΆμ½ μΈμ μ΄λ¦μ μ¬μ©νλ©΄ μΈμ κ°κ³Ό κ·Έ μΈμλ‘ μ²λ¦¬ν λ μ¬μ©νλ μΈμκ° κ°λ€λ κ²μ μκΈ°μ μΈμλ₯Ό μ λ ₯ λ°λ λΆλΆκ³Ό in ν€μλ λΆλΆμ μλ΅ κ°λ₯
reversedNames = names.sorted(by: { $0 > $1 } )
μ°μ°μ λ©μλ (Operator Methods)
sorted(by:) λ©μλμλ μΈμ λκ°λ₯Ό λ°μ λ κ°μ λΉκ΅νλ€λκ±Έ (>) μ°μ°μ λ©μλλ‘ μΆλ‘ ν μ μμΌλ―λ‘ μλμ κ°μ΄ μΆμ½λ κ°λ₯
reversedNames = names.sorted(by: >)
νν ν΄λ‘μ (Trailing Closures)
ν¨μμ λ§μ§λ§ μΈμλ‘ ν΄λ‘μ λ₯Ό λ£κ³ κ·Έ ν΄λ‘μ κ° κΈΈλ€λ©΄ νν ν΄λ‘μ λ₯Ό μ¬μ©κ°λ₯
func someFunctionThatTakesAClosure(closure: () -> Void) {
// function body goes here
}
someFunctionThatTakesAClosure() {
// trailing closure's body goes here
}
- μμ ν¨μμ ν΄λ‘μ λ₯Ό λ°μ νν ν΄λ‘μ λ‘ νν κ°λ₯
κ° μΊ‘μ² (Capturing Values)
μ μλ μ£Όλ³ μ»¨ν μ€νΈλ‘λΆν° μμ, λ³μμ κ°μ μΊ‘μ²ν μ μμ
μλ³Έ κ°μ΄ μ¬λΌμ Έλ ν΄λ‘μ Έμ body μμμ κ·Έ κ°μ νμ© κ°λ₯
μ€μ²© ν¨μ
- κ°μ₯ κ°λ¨ν ν΄λ‘μ
- ν¨μ λ°μ μλ μμ, λ³μλ₯Ό μΊ‘μ²ν μ μμ
- λ°μ μλ ν¨μμ μΈμλ μΊ‘μ²ν μ μμ
func makeIncrementer(forIncrement amount: Int) -> () -> Int {
var runningTotal = 0
func incrementer() -> Int {
runningTotal += amount
return runningTotal
}
return incrementer
}
ν΄λ‘μ λ μ°Έμ‘° νμ (Closures Are Reference Types)
ν¨μμ ν΄λ‘μ λ₯Ό μμλ λ³μμ ν λΉν λ μ€μ λ‘λ μμμ λ³μμ ν΄λΉ ν¨μλ ν΄λ‘μ μ μ°Έμ‘°(reference)κ° ν λΉ
let alsoIncrementByTen = incrementByTen
alsoIncrementByTen()
// 50μ λ°νν©λλ€.
μ΄μ€μΌμ΄ν ν΄λ‘μ (Escaping Closures)
ν¨μκ°λλκ³ μ€νλλ ν΄λ‘μ μ΄λ©°, λΉλκΈ° μμ μ νκΈ° μν΄ μ¬μ©
νλΌλ―Έν° νμ μμ @escapingμ΄λΌλ ν€μλλ₯Ό λͺ μ
var completionHandlers: [() -> Void] = []
func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
completionHandlers.append(completionHandler)
}
β» @escaping ν΄λ‘μ λ₯Ό μ¬μ©ν λλ selfλ₯Ό λͺ μμ μΌλ‘ μ¬μ©ν΄μΌ ν¨
func someFunctionWithNonescapingClosure(closure: () -> Void) {
closure() // ν¨μ μμμ λλλ ν΄λ‘μ = non-escaping
}
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"
ν΄λ‘μ λ₯Ό ν¨μμ μΈμ κ°μΌλ‘ λ£λ μμ
// 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!"
// 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!"
- @autoclosureν€μλλ₯Ό μ΄μ©ν΄μ λ³΄λ€ κ°κ²°νκ² μ¬μ© κ°λ₯
'β¨οΈ Language > swift' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Swift] νλ‘νΌν° (0) | 2024.03.20 |
---|---|
[Swift] ν΄λμ€μ ꡬ쑰체 (0) | 2024.03.19 |
[Swift] μμΈ μ²λ¦¬μ ν¨μ (4) | 2024.03.17 |
[Swift] 쑰건/λ°λ³΅λ¬Έ (1) | 2024.03.17 |
[Swift] μ½λ μ νμ (0) | 2024.03.16 |