(Swift) - ν΄λ‘μ (Closure)
ν΄λ‘μ (Closure) λ?
κ°λ¨νκ² λ§νλ©΄ ν΄λ‘μ λ μΌμ κΈ°λ₯μ νλ μ½λλ₯Ό { }
λ‘ λͺ¨μλμκ²μ λ§νλ€. κ·Έλ¦¬κ³ μΌλ°μ μΈ func
λ‘ μ μΈλλ ν¨μμ μμκ°λ
μ΄ ν΄λ‘μ μ΄λ€.
μ ν΄λ‘μ λΌκ³ νμ§?
ν΄λ‘μ λ λ³μ, μμκ° μ μΈλ μ€μ½νμμ μ°Έμ‘°λ₯Ό μΊ‘μ³(μ μ₯) ν μ μλλ° μ΄κ±Έ ν΄λ‘μ§μ΄λΌκ³ νλ©° κ·Έλμ ν΄λ‘μ λΌκ³ μ΄λ¦λΆμ¬μ‘λ€.
ν΄λ‘μ λ₯Ό μ μ°λ?
μ€μννΈλ ν¨μν νλ‘κ·Έλλ° ν¨λ¬λ€μμ΄λΌκ³ νλλ°, μ΄λ¬ν μ€νμΌμ ν΄λ‘μ κ° μ€μν μν μ νλ€. ν΄λ‘μ λ₯Ό μ λ€λ¦, νλ‘ν μ½, λͺ¨λλμ ν¨κ» μ¬μ©νλ©΄μ μ€μννΈλ λ κ°λ ₯ν μΈμ΄κ° λ μμλ€.
ν΄λ‘μ μ νν(μ’ λ₯)
- μ΄λ¦μ΄ μκ³ , κ°μ μΊ‘μ³νμ§ μκ³ , μ μν¨μμ νν
- μ΄λ¦μ΄ μκ³ , λ€λ₯Έ ν¨μμ κ°μ μΊ‘μ³νλ μ€μ²©λ(nested) ν¨μ νν
- μ΄λ¦ μκ³ , μ£Όλ³ contextμ λ°λΌμ κ°μ μΊ‘μ³ν μ μλ μΆμ½ ν¨μνν.
ν΄λ‘μ μ ννλ°©λ²
μμ νκ² λμΉμΈ μ½λλΌλ, ν΄λ‘μ λ ννλ°©λ²μ΄ μ¬λ¬κ°μ§μ΄κΈ° λλ¬Έμ μ΄λ ΅κ² λκ»΄μ§λκ²κ°λ€.
- parameterμ νμ , λ°ν κ°μ νμ μ μλ΅ν μ μλ€. (swiftλ νμ μΆλ‘ μ΄ κ°λ₯νλ―λ‘)
- ν΄λ‘μ λΈλ μμ μ½λκ° νμ€μ΄λΌλ©΄, μμμ μΌλ‘ μ΄λ₯Ό λ°νκ° μ²λ¦¬νλ€.
- μΆμ½λ argument name μ μ¬μ©ν μ μλ€. ($0... $1... λ±μΌλ‘ μ¬μ©νλκ²)
- νν ν΄λ‘μ (trailing closure) λ¬Έλ²μ μ¬μ©ν μ μλ€.
a * b λ₯Ό λ°ννλ ν΄λ‘μ
μλ 3κ°μ ν΄λ‘μ λ λͺ¨λ κ°μ μ½λμ΄λ€.
var multiply: (Int, Int) -> Int = { (a: Int, b:Int) -> Int in
return a * b
}
/// - νλΌλ―Έν°(맀κ°λ³μ)μ νμ
μμ κ°λ₯
var multiply2: (Int, Int) -> Int = { (a, b) -> Int in
return a * b
}
// return ν€μλ μμ κ°λ₯ + νλΌλ―Έν°(맀κ°λ³μ) μμ κ°λ₯
var multiply3: (Int, Int) -> Int = {$0 * $1}
$0, $1 μ κ°κ° a,bλ₯Ό μλ―Ένλ©° μ΄λ κ² νννλ κ²μ shorhand argumentλΌκ³ νλ€.
ν¨μκ° ν΄λ‘μ λ₯Ό argumentλ‘ λ°λμν© - λ€μν νμ©μ΄ κ°λ₯
func operateTwoNum(a: Int, b: Int, operation: (Int, Int) -> Int) -> Int {
let result = operation(a,b)
return result
}
var add: (Int, Int) -> Int = { a,b in
return a + b
}
operateTwoNum(a: 4, b: 9, operation: multiply) // multyplyλ₯Ό λ£μΌλ©΄ κ³±νκΈ°
operateTwoNum(a: 4, b: 9, operation: add) // add ν΄λ‘μ λ₯Ό λ£μ΄ λνκΈ°
operateTwoNum(a: 4, b: 9 ){ a, b in // μκ·λ¨ΌνΈ λΈλμ ν΄λ‘μ λ₯Ό μ§μ ꡬνν΄λ λλ€.
return a - b
}
typealiasμ κ°μ΄ μ¬μ©νλ ν΄λ‘μ
let c = {(str:String)->String in
return "Hello \(str)"
}
typealias MyType = (String) -> String
func perform(closure: MyType){
print(closure("iOS"))
}
perform(closure: c) // closureμ cλ₯Ό μ λ¬
fucking closure syntax
Urlμ νλμμ§λ§ κ°λ³΄λ©΄ λ€μν ν΄λ‘μ ννκ° λμ¨λ€.
https://fuckingclosuresyntax.com/
μ°Έκ³ μλ£
https://docs.swift.org/swift-book/LanguageGuide/Closures.html#ID103