ν΄λ‘μ λ μ£Όλ³μ μ λ¬λκ±°λ, μ½λμμ μ¬μ©λ μ μλ κΈ°λ₯ λΈλμ λ§νλ€. ν΄λ‘μ λ μ μλ λ¬Έμ₯μμμ μμμ λ³μμ λν μ°Έμ‘°κ°μ μΊ‘μ² ν μ μλ€. μ€μννΈλ μΊ‘μ²λ λ©λͺ¨λ¦¬λ₯Ό κ΄λ¦¬ν μ μλ λͺ¨λ κΈ°λ₯μ μ 곡νλ€.
μ μν¨μμ μ€μ²©ν¨μλ ν΄λ‘μ μ λ€λ₯Έ μ΄λ¦μ΄λ€. ν΄λ‘μ λ μλ μΈκ°μ§ ννμ€ νλμ ννλ₯Ό μ·¨νλ€.
- μ μν¨μλ μ΄λ¦μ κ°μ§κ³ μμΌλ κ°μ μΊ‘μ²νμ§ μλ ν΄λ‘μ μ΄λ€.
- μ€μ²©ν¨μλ μ΄λ¦μ κ°μ§κ³ μκ³ λ΄λΆμ ν¨μλ‘λΆν° κ°μ μΊ‘μ²ν μ μλ ν΄λ‘μ μ΄λ€.
- ν΄λ‘μ ννμμ μ£Όλ³ λ¬Έμ₯μΌλ‘λΆν° κ°μ μΊ‘μ³ν μ μλ μ΄λ¦μ΄ μλ κ²½λꡬ문μ λ§νλ€.
μ€μννΈμμ ν΄λ‘μ ννμμ κ°κ²°νκ³ κΉλνκ³ λͺ λ°±ν μ€νμΌμ μΆκ΅¬νλ€. ν΄λ‘μ μ μ΅μ νλ λ€μμ ν¬ν¨νλ€.
- λ¬Έμ₯μ ν΅ν΄ νλΌλ―Έν°μ λ¦¬ν΄ κ°μ μ μΆνλ€.
- λ¨μΌμ ν΄λ‘μ λ‘ λΆν° 리ν΄κ°μ μμμ μΌλ‘ λ°ννλ€.
- κ°λ¨ν μκ·λ¨ΌνΈ μ΄λ¦
- νν ν΄λ‘μ ꡬ문
ν΄λ‘μ ννμ (Closure Expressions)
μ€μ²©ν¨μλ μμ ν¨μμ λ΄ν¬λ ν¨μμ μ΄λ¦μ μ μνκΈ°μ νΈλ¦¬νλ€. κ·Έλ¬λ λλλ‘ κ°λ¨ν μμ€μ ν¨μλ₯Ό μμ ν μ μΈκ³Ό μ΄λ¦μμ΄ κ΅¬ννλ κ²μ΄ νΈλ¦¬ν λλ μ‘΄μ¬νλ€. νΉν λ€μμ μκ·λ¨ΌνΈλ₯Ό κ°μ§κ³ μλ ν¨μλ₯Ό μ¬μ©ν λ λμ± κ·Έλ λ€.
ν΄λ‘μ ννμμ΄λ μΈλΌμΈ ν΄λ‘μ λ‘ μμ λμ± λ¨μνκ³ κ°κ²°νκ² λνλ΄λ κ²μ΄λ€. ν΄λ‘μ ννμμ λͺ νμ±κ³Ό μλλ₯Ό μμ§ μκ³ ν΄λ‘μ λ₯Ό λμ± κ°κ²°νκ² λνλΌ μ μκ² μ΅μ ν λμλ€.
//λ¬Έλ§₯μμ νμ
μΆλ‘
//λ¨μΌ νν ν΄λ‘μ μμμ μμμ λ°ν
//μΈμ μ΄λ¦ μΆμ½
var number = [1, 4, 5, 2, 3, 7, 8, 6]
print(number.sorted(by: { (s1: Int, s2: Int) -> Bool in return s1 > s2 } ))
// ν΄λ‘μ μ κΈ°λ³Έ ννλ² by μ 맀κ°λ³μ κ°μΌλ‘ ν΄λ‘μ λ₯Ό μ¬μ©
// λ¬Έλ§₯μμ νμ
μΆλ‘
print(number.sorted(by: {s1, s2 in return s1 > s2}))
/* sorted(by:)μ λ©μλμμ μ΄λ―Έ (Int, Int) -> Bool νμ
μ μΈμκ° λ€μ΄μμΌ νλκ±Έ
μκΈ° λλ¬Έμ ν΄λ‘μ μμ μ΄ νμ
λ€μ μλ΅μ΄ κ°λ₯νλ€.*/
// λ¨μΌ νν ν΄λ‘μ μμμ μμμ λ°ν
print(number.sorted(by: { s1, s2 in s1 > s2 } ))
// return νλ κ°μ΄ νλμΌ κ²½μ°μ return μλ΅μ΄ κ°λ₯
// μΈμ μ΄λ¦ μΆμ½
print(number.sorted(by: { $0 > $1 } ))
// κ°μ μμλλ‘ $0, $1, $2 λ±μΌλ‘ νννμ¬ μΈμ μ
λ ₯λΆλΆκ³Ό in ν€μλ λΆλΆμ μλ΅
νν ν΄λ‘μ (Trailing Closures)
ν¨μλ₯Ό λ§μ§λ§ μκ·λ¨ΌνΈλ‘ λ°λ ν¨μμμλ νν ν΄λ‘μ λ¬Έλ²μ μ¬μ©νλ κ²μ΄ μ’λ€.
func someFunctionThatTakesAClosure(closure: () -> Void) {
// ν¨μ λ΄μ©
}
// ννν΄λ‘μ λ₯Ό μ¬μ©νμ§ μκ³ ν¨μλ₯Ό ꡬννλ λ°©λ²
someFunctionThatTakesAClosure(closure: {
// ν¨μ λ΄μ©
})
// ννν΄λ‘μ λ₯Ό μ¬μ©νκ³ ν¨μλ₯Ό ꡬννλ λ°©λ²
someFunctionThatTakesAClosure() {
// ννν΄λ‘μ λ₯Ό μ¬μ©ν ν¨μ λ΄μ©
}
ex) reversedNames = names.sorted { $0 > $1 }
μΊ‘μ²κ° (Capturing Values)
ν΄λ‘μ λ μ μΈλ λ¬Έμ₯ μ£Όλ³μΌλ‘λΆν° μμμ λ³μλ₯Ό μΊ‘μ²ν μ μλ€. κ·Έλ¦¬κ³ ν΄λ‘μ λ μμμ λ³μκ° μ μλ μλ λ²μκ° λμ΄μ μ‘΄μ¬νμ§ μλλΌλ ν΄λ‘μ λ΄μμ ν΄λΉ μμμ λ³μμ κ°μ μ°Έμ‘°νκ³ μμ ν μ μλ€.
func makeIncrementer(forIncrement amount: Int) -> () -> Int {
var runningTotal = 0
func incrementer() -> Int {
runningTotal += amount
return runningTotal
}
return incrementer
}
incrementer() ν¨μλ νλΌλ―Έν°κ° μμΌλ©° ν¨μ λ°λλ΄μ runningTotal κ³Ό amount λ₯Ό μ°Έμ‘°νκ³ μλ€. runningTotal κ³Ό amountλ₯Ό μΊ‘μ²νκ³ ν¨μ λ΄μμ μ¬μ©νλ€. μ°Έμ‘°λ₯Ό μΊ‘μ²νλ κ²μ makeIncrementer νΈμΆμ΄ μ’ λ£λ μ§λΌλ runningTotal κ³Ό amountκ° μ¬λΌμ§μ§ μκ³ λ€μμ incrementer ν¨μκ° νΈμΆλ λ runningTotalλ₯Ό κ·Έλλ‘ μ¬μ©ν μ μμ΅λλ€.
let incrementByTen = makeIncrementer(forIncrement: 10)
incrementByTen()
// returns a value of 10
incrementByTen()
// returns a value of 20
incrementByTen()
// returns a value of 30
NoteβοΈ
ν΄λ‘μ λ μ°Έμ‘° νμ μ΄λ€.
μ΄μ€μΌμ΄ν ν΄λ‘μ (Escaping Closures)
μΌλ°μ μΌλ‘λ ν¨μμ μ€νμ΄ μ’ λ£λλ©΄ νλΌλ―Έν°λ‘ μ°μ΄λ ν΄λ‘μ λ μ κ±°κ° λλ€. κ·Έλμ ν΄λ‘μ μ μ€νμ μΈλΆ λ³μμ μ μ₯νμ¬ λ³Έλμ ν¨μλ₯Ό λ²μ΄λλ μ€ννλλ‘ νκΈ° μν΄μλ @escaping ν€μλκ° νμνλ€.
// λ¨μμ€ν
func normalClosuer(closure: () -> ()) {
print("νλ¦°νΈ μμ")
closure()
}
normalClosuer {
print("νλ¦°νΈ μ’
λ£")
}
-> νλ¦°νΈ μμ, νλ¦°νΈ μ’
λ£κ° κ·Έλλ‘ νλ¦°νΈ λ¨
var function1 : () -> () = { print("μΆλ ₯") }
function1()
-> "μΆλ ₯"μ νλ¦°νΈ ν¨
func performEscaping(closure: @escaping () -> ()) {
function1 = closure
// function1 λ³μμν λΉ
}
performEscaping(closure: { print("λ€λ₯΄κ² μΆλ ₯") })
-> "λ€λ₯΄κ² μΆλ ₯"μ νλ¦°νΈ νλ κ²μ΄ μλ function1μ ν λΉλ§ νκ²λ¨
function1()
-> λ³Έλμ ν¨μλ₯Ό λΉ μ Έλμμλ "λ€λ₯΄κ² μΆλ ₯" νλ¦°νΈ ν¨
μΊ‘μ²λ¦¬μ€νΈ
ν΄λ‘μ μΈλΆμ λ³μλ₯Ό μ¬μ©νκΈ° μν΄ λ³μλ₯Ό μΊ‘μ²νλ νμμ΄ λ°μνλ€. μ΄λ μΈλΆ λ³μμ μ£Όμλ₯Ό μ°Έμ‘°νλ ννλ‘ μ΄λ£¨μ΄ μ§λ€. νμ§λ§ μΊ‘μ²λ¦¬μ€νΈλ₯Ό μ¬μ©νλ©΄ λ³μμ μ£Όμλ₯Ό κ°μ Έμ€λ κ²μ΄ μλ κ° μ체λ₯Ό 볡μ¬ν΄μ κ°μ Έμ€κ² λλ€.(κ°νμ μ κ²½μ°)
μ°Έμ‘°νμ μ μΊ‘μ²λ¦¬μ€νΈ
class SomeClass {
var num = 0
}
var x = SomeClass()
var y = SomeClass()
print("μ°Έμ‘° μ΄κΈ°κ°(μμκ°):", x.num, y.num)
let refTypeCapture = { [x] in
print("μ°Έμ‘° μΆλ ₯κ°(μΊ‘μ²λ¦¬μ€νΈ):", x.num, y.num)
}
// μ½νμ°Έμ‘° μ¬μ©λ°©λ²
ex) let refTypeCapture = { [weak x] in
print("μ°Έμ‘° μΆλ ₯κ°(μΊ‘μ²λ¦¬μ€νΈ):", x?.num, y.num)
}
μ΄ κ²½μ° xλ someClassλ΄μ numνλ‘νΌν° μ체μ μ£Όμλ₯Ό κ°μ Έμμ μ§μ μ μΌλ‘ μ°Έμ‘°νκ² λλ(RC2), yμ κ²½μ°λ yλ³μμ μ£Όμλ₯Ό λ¨Όμ μ°Έμ‘°νλ€μ numμ μ£Όμκ°μ μ°Έμ‘°νκ² λλ€(RC1). κ·Έλ¬λ―λ‘ μ°Έμ‘°νμ μ μΊ‘μ²λ¦¬μ€νΈλ₯Ό μ¬μ©ν λμλ μνμ°Έμ‘°μ μν λ©λͺ¨λ¦¬ λμμ μ μν΄μΌνλ€.
'π¦ Swift' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Structures and Classes (0) | 2022.06.22 |
---|---|
Enumerations (0) | 2022.06.15 |
Functions (0) | 2022.06.01 |
Control Flow (0) | 2022.06.01 |
Collection Types (0) | 2022.05.22 |