Closure
ν΄λ‘μ λ μΌμ κΈ°λ₯μ νλ μ½λλ₯Ό νλμ λΈλ‘μΌλ‘ λͺ¨μλμ κ²μ λ§ν©λλ€.
μ€νκ°λ₯ν μ½λλΈλμ΄λΌκ³ λ ν μ μμ΅λλ€.
ν¨μλ ν΄λ‘μ μ ν νν (ν¨μλ μ΄λ¦μ΄ μλ ν΄λ‘μ )
ν΄λ‘μ λΌλ κ°λ μμ ν¨μκ° ν¬ν¨λλ κ²μ΄λΌκ³ ν μ μμ΅λλ€.
→ ν¨μ: named Closure , μ΄μΈμ ν΄λ‘μ λ€μ λ€ (unamed) Closure
ν΄λ‘μ λ μΌκΈκ°μ²΄μ νΉμ±μ κ°μ§κ³ μμ
κ·Έλ κΈ° λλ¬Έμ λ³μλ μμμ λμ νκ³ , λ°ν(return)κ°λ₯νλ©° νλΌλ―Έν°λ‘ λ°μ μ μλ€.
== μ λ¬μΈμ, λ³μ, μμ λ±μ μ μ₯ λ° μ λ¬μ΄ κ°λ₯νλ€λ λ»
ν¨μμ λ€λ₯΄κ² μ΄λ¦μ μκ° νμνμ§λ μμ§λ§, 맀κ°λ³μ μ λ¬κ³Ό λ°ν κ°μ΄ μ‘΄μ¬ν μ μλ€λ μ μ΄ λμΌ
ν΄λ‘μ ννμ
{ (parameters) -> ReturnType in // closure head
μ€νμ½λ(body) // closure body
}
-> μ μ΄μ©ν΄ λ°ν νμ μ λͺ μν©λλ€.
ν΄λ‘μ ν€λμ ν΄λ‘μ λ°λλ₯Ό ꡬλΆμ§μ΄μ£Όλ κ²μ΄ in ν€μλ!
κΈ°λ³Έ ν΄λ‘μ
1οΈβ£ νλΌλ―Έν°μ 리ν΄νμ μ΄ λλ€ μλ ν΄λ‘μ
2οΈβ£ νλΌλ―Έν°μ 리ν΄νμ μ΄ μλ ν΄λ‘μ
1. νλΌλ―Έν°μ 리ν΄νμ μ΄ λλ€ μλ ν΄λ‘μ
ν΄λ‘μ λ μΌκΈκ°μ²΄μ΄κΈ° λλ¬Έμ μμμ ν΄λ‘μ λ₯Ό λμ ν μ μλ€.
let closure = { () -> () in
print("Closure")
}
Swiftμμ ν¨μλ 리ν΄νμ μ΄ μμΌλ©΄ μλ΅μ΄ κ°λ₯ν¨. ν΄λ‘μ λ λ§μ°¬κ°μ§λ‘ μλ΅μ΄ κ°λ₯!
κ·Όλ°!!! ν΄λ‘μ λ 리ν΄νμ μμ΄λ μλ΅μ΄ κ°λ₯ν¨
μκ²μ μμμ λ°ν ννμ΄λΌκ³ νλλ°, ν΄λ‘μ κ° λ°ννλ κ°μ΄ μλ€λ©΄ ν΄λ‘μ μ λ§μ§λ§ μ€μ κ²°κ³Όκ°μ return ν€μλλ₯Ό μλ΅νλλΌλ μμμ μΌλ‘ λ°νκ°μΌλ‘ μ·¨κΈνλ€. (μλ μμ μ½λμ κ°μ΄)
result = calculate(a: 10, b: 10) {
a + b
}
print(result) // 20
2. νλΌλ―Έν°μ 리ν΄νμ μ΄ μλ ν΄λ‘μ
let closure = { (name: String) -> String in
return "Hello, \\(name)"
}
but μ¬κΈ°μ ν κ°μ§ μ£Όμν μ μ!!!!! μ΄ μΉκ΅¬ νΈμΆν λμ
closure("jane")
closure(name: "jane") // μ΄λ κ² μ°λ©΄ μλ¬λ©λλ€
μμ κ°μ΄ ν΄λ‘μ λ₯Ό νΈμΆν λλ argument labelμ μ¬μ©νμ§ μλλ€.
‘name’μ μ€μ§ parameter name!!
β κ·Όλ° μ νλΌλ―Έν° λ€μμ΄ λΆνμνλ€λ©΄???
λ¨μΆ μΈμ μ΄λ¦μ νμ©ν μ μλ€.
λ¨μΆ μΈμ μ΄λ¦μ ν΄λ‘μ μ 맀κ°λ³μμ μμλλ‘ $0, $1, $2...μ²λΌ νν (μλ μ½λμ κ°μ΄)
result = calculate(a: 10, b: 10) {
$0 + $1
}
print(result) // 20
βοΈ μΌκΈκ°μ²΄λ‘μ ν΄λ‘μ βοΈ
1οΈβ£ ν΄λ‘μ λ₯Ό λ³μ, μμμ λμ κ°λ₯
2οΈβ£ ν¨μμ λ°ν νμ μΌλ‘ ν΄λ‘μ λ₯Ό μ¬μ© κ°λ₯
3οΈβ£ ν¨μμ νλΌλ―Έν° νμ μΌλ‘ ν΄λ‘μ λ₯Ό μ λ¬ κ°λ₯ (ν¨μμ μ λ¬μΈμλ‘ μ¬μ©ν μ μλ€)
1. ν΄λ‘μ λ₯Ό λ³μ, μμμ λμ κ°λ₯
// ν΄λ‘μ μ μΈκ³Ό λμμ λμ
let closure = { () -> () in
print("Closure")
}
// μλ‘μ΄ λ³μλ μμμ λμ
λ κ°λ₯
let closure2 = closure
2. ν¨μμ λ°ν νμ μΌλ‘ ν΄λ‘μ λ₯Ό μ¬μ©κ°λ₯
func doSomething() -> () -> () {
}
// μ΄λ κ² ν΄λ‘μ λ₯Ό 리ν΄ν μ μλ€
func doSomething() -> () -> () {
return { () -> () in
print("Hello!")
}
}
// μ€ν
let closure = doSomething()
closure()
3. ν¨μμ νλΌλ―Έν° νμ μΌλ‘ ν΄λ‘μ λ₯Ό μ λ¬ κ°λ₯
// ν¨μλ₯Ό νλΌλ―Έν°λ‘ μ λ¬λ°λ doSomethingμ΄λΌλ ν¨μκ° μμ
func doSomething(closure: () -> ()) {
closure()
}
// νλΌλ―Έν°λ‘ μ΄λ κ² ν΄λ‘μ λ₯Ό λ겨μ€λ λλ€
doSomething(closure: { () -> () in
print("Hello!") // Hello!
})
π½ ν΄λ‘μ λ μμΈν μ 리ν κΈ!!!
κ³ μ°¨ν¨μ
κ³ μ°¨ν¨μλ λ€λ₯Έ ν¨μ(=ν΄λ‘μ )λ₯Ό μ λ¬μΈμλ‘ λ°κ±°λ ν¨μ(=ν΄λ‘μ )λ₯Ό κ²°κ³Όλ‘ λ°ννλ ν¨μλ₯Ό λ§ν©λλ€.
(Swiftλ ν¨μλ₯Ό μΌκΈ κ°μ²΄λ‘ μ·¨κΈνκΈ° λλ¬Έμ ν¨μλ₯Ό λ€λ₯Έ ν¨μμ μ λ¬μΈμλ‘ μ¬μ©νκ±°λ ν¨μλ₯Ό κ²°κ³Όλ‘ λ°ννλ κ²μ΄ κ°λ₯)
λνμ μΈ κ³ μ°¨ν¨μλ‘ map, filter, reduceκ° μμ
κ³ μ°¨ν¨μ μ§μ ꡬνν΄λ³΄κΈ°
extension Array {
func myMap<T>(_ transform: (Element) -> T) -> [T] {
var arr = [T]()
for i in self {
arr.append(transform(i))
}
return arr
}
func myFilter(_ transform: (Element) -> Bool) -> [Element] {
var arr = [Element]()
for i in self {
if transform(i) {
arr.append(i)
}
}
return arr
}
func myReduce(_ initialResult: Element,
_ nextPartialResult: (Element, Element) -> Element) -> Element {
var result = initialResult
for i in self {
result = nextPartialResult(result, i)
}
return result
}
}
let mapResult = [1, 2].myMap{ $0 * 2 }
print("mapResult:", mapResult) // [2, 4]
let filteredArr = [1, 2].myFilter { $0 % 2 == 0 }
print("filteredArr:", filteredArr) // [2]
let sum = [1, 2].myReduce(0) {
return $0 + $1
}
print("sum:", sum) // 3
π½ Swift κ³ μ°¨ν¨μ λ΄λΆ ꡬν νμΈνκΈ°
https://github.com/apple/swift/blob/main/stdlib/public/core/SequenceAlgorithms.swift#L624
'π κΈ°λ‘ > TIL' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[TIL] 20231215 (1) | 2023.12.18 |
---|---|
[TIL] 20231207 (3) | 2023.12.08 |
[TIL] 20231206 (0) | 2023.12.08 |
[TIL] 20231205 (2) | 2023.12.05 |
[TIL] 20231204 (1) | 2023.12.04 |