[Swift] ν΄λ‘μ
π‘ ν΄λ‘μ
1. μ΄λ¦μ΄ μλ ν¨μ
2. μΌμ κΈ°λ₯μ νλ μ½λλ₯Ό νλμ λΈλ‘μΌλ‘ λͺ¨μλμ κ²
μ½λλ₯Ό μ μ©νκ² μμ±νκΈ° μν΄ μ¬μ©νλ€.
ν΄λ‘μ νν λ°©λ²
ν΄λ‘μ κ° ν¨μμ λͺ¨μ΅μ΄ μλ νλμ λΈλ‘ λͺ¨μ΅μΌλ‘ ννλ μ μλ λ°©λ²
{ (λ§€κ°λ³μλ€) -> λ°ννμ
in
μ€νμ½λ
}
** inμ΄λΌλ ν€μλλ μ μλΆμ μ€νλΆλ₯Ό λΆλ¦¬νκΈ° μν΄μ μ¬μ©νλ€
ν¨μμ ν΄λ‘μ λΉκ΅
** ν¨μλ ν΄λ‘μ μ ν ννμ΄λ€
let names: [String] = ["Bonny", "John", "Ham"]
// λ°°μ΄ κ°μ μ λ ¬νλ sorted(by: ) λ©μλλ₯Ό ν΅ν΄ ν¨μμ ν΄λ‘μ λΉκ΅ν΄λ³΄κΈ°
// ν¨μ
func backwards(first: String, second: String) -> Bool {
return first > second //trueμΌ κ²½μ° first λ°ν
}
let reversed1: [String] = names.sorted(by: backwards(first:second:))
print(reversed1)
// ν΄λ‘μ
let reversed2: [String] = names.sorted(by: { (first: String, second: String) -> Bool in
return first > second
})
print(reversed2)
ν΄λ‘μ νν κ°μν
// 1. λ¬Έλ§₯μ μ΄μ©ν νμ
μ μΆ(μλ£ν μλ΅)
let SimpleClosure1: [String] = names.sorted(by: { (first, second) -> Bool in
return first > second
})
// 2. λ¨μΆ μΈμ μ΄λ¦($0, $1, ...)
let SimpleClosure2: [String] = names.sorted {
return $0 > $1
}
// 3. μμμ λ°ν νν(return μλ΅)
let SimpleClosure3: [String] = names.sorted { $0 > $1 }
// 4. μ°μ°μλ§ νκΈ°νκΈ°(λ§€κ°λ³μ νμ
κ³Ό λ°ν νμ
μ΄ μ°μ°μλ₯Ό ꡬνν ν¨μ λͺ¨μκ³Ό λμΌν κ²½μ°)
let SimpleClosure4: [String] = names.sorted (by: >)
ν΄λ‘μ κ° νλ
- μμ μ΄ μ μλ μμΉμ μ£Όλ³ λ¬Έλ§₯μ ν΅ν΄ μμλ λ³μλ₯Ό νλν μ μλ€
- ν΄λ‘μ λ λΉλκΈ° μμ μ λ§μ΄ μ¬μ©λλλ°, ν΄λ‘μ λ₯Ό ν΅ν΄ λΉλκΈ° μ½λ°±μ μμ±νλ κ²½μ° νμ¬ μνλ₯Ό 미리 νλν΄λμ§ μμΌλ©΄ ν΄λ‘μ μ κΈ°λ₯μ μ€ννλ μκ° μ£Όλ³μ μμλ λ³μκ° λ©λͺ¨λ¦¬μ μ‘΄μ¬νμ§ μλ κ²½μ°κ° λ°μν μ μλ€
func makeIncrementer(forIncrement amount: Int) -> (() -> Int) {
var runningTotal = 0
// μ€μ²© ν¨μ incrementer()λ μμ μ£Όλ³μμ runningTotalκ³Ό amount κ°μ νλνλ€
// λ κ°μ νλν ν ν΄λ‘μ λ‘μ makeIncrementer()μ μν΄ λ°νλλ€
func incrementer() -> Int {
runningTotal += amount
return runningTotal
}
return incrementer
}
// () -> Int λ ν¨μ κ°μ²΄λ₯Ό λ°ννλ€λ μλ―Έμ΄λ€ λ§€κ°λ³μλ₯Ό λ°μ§ μκ³ λ°ν νμ
μ IntμΈ ν¨μμ΄λ€
// forIncrementλ μ λ¬μΈμ λ μ΄λΈ
// runningTotalκ³Ό amountκ°μ makeIncrementer() ν¨μ μ€νμ΄ λλλ μ¬λΌμ§μ§ μλλ€
// => ν¨μλ₯Ό νΈμΆν λλ§λ€ λ κ°μ κ°μ΄ λμ λλ€
let incrementByTwo: (()->Int) = makeIncrementer(forIncrement: 2)
// ν¨μμ ν΄λ‘μ λ μ°Έμ‘° νμ
μ΄κΈ° λλ¬Έμ λ³μμ ν λΉν λλ§λ€ μ¬μ€μ μμλ λ³μμ ν¨μλ ν΄λ‘μ μ μ°Έμ‘°λ₯Ό μ€μ νλ κ²μ΄λ€
let first: Int = incrementByTwo()
print(first) //2
let second: Int = incrementByTwo()
print(second) //4
let third: Int = incrementByTwo()
print(third) //6
// μλ‘κ² μ μΈλ λλ§λ€ μ΄κΈ°νλμ§ μκ³ μ΄μ μ μΊ‘μ³ν κ°μΌλ‘ κ³μν΄μ μ¬μ©νλ€!
νμΆ ν΄λ‘μ
ν¨μμ μ λ¬μΈμλ‘ μ λ¬ν ν΄λ‘μ κ° ν¨μ μ’ λ£ νμ νΈμΆλ λ ν΄λ‘μ κ° ν¨μλ₯Ό νμΆνλ€κ³ νννλ€
ν΄λ‘μ λ₯Ό λ§€κ°λ³μλ‘ κ°λ ν¨μ μ μΈμ λ§€κ°λ³μ μ΄λ¦μ μ½λ‘ λ€μ @escaping ν€μλ μ¬μ©
ν΄λ‘μ κ° ν¨μλ₯Ό νμΆν μ μλ κ²½μ°
- ν¨μ μΈλΆμ μ μλ λ³μλ μμμ μ μ₯λμ΄ ν¨μκ° μ’ λ£λ νμ μ¬μ©ν κ²½μ°
- ν¨μμ μ λ¬μΈμλ‘ μ λ¬λ°μ ν΄λ‘μ λ₯Ό λ€μ λ°νν κ²½μ°
func someFunctionWithEscapingClosure(completionHandler: @escaping() -> Void) {
completionHandlers.append(completionHandler)
}
var completionHandlers: [() -> Void] = []
//νμΆ ν΄λ‘μ λ₯Ό λ§€κ°λ³μλ‘ κ°λ ν¨μ
func someFunctionWithEscapingClosure(completionHandler: @escaping() -> Void) {
completionHandlers.append(completionHandler)
}
typealias VoidClosure = () -> Void
let firstClosure: VoidClosure = {
print("Closure A")
}
let secondClosure: VoidClosure = {
print("Closure B")
}
// μ λ¬μΈμλ‘ μ λ¬λ°μ ν΄λ‘μ λ₯Ό ν¨μ μΈλΆλ‘ λ€μ λ°ν -> ν¨μ νμΆ
func returnOneClosure(first: @escaping VoidClosure, second: @escaping VoidClosure,
shouldReturnFirstClosure: Bool) -> VoidClosure {
return shouldReturnFirstClosure ? first : second
}
// ν¨μ μΈλΆλ‘ λ°νν ν΄λ‘μ λ₯Ό ν¨μ μΈλΆμ μμμ μ μ₯
let returnedClosure: VoidClosure = returnOneClosure(first: firstClosure, second: secondClosure, shouldReturnFirstClosure: true)
returnedClosure() //Closure A
var closures: [VoidClosure] = []
func appendClosure(closure: @escaping VoidClosure) {
closures.append(closure)
}
withoutActuallyEscaping
μ€μ λ‘λ νμΆνμ§ μλλ° λ€λ₯Έ ν¨μμμ νμΆ ν΄λ‘μ λ₯Ό μꡬνλ μν©
withoutActuallyEscaping(_ : do: )
let numbers: [Int] = [2, 4, 6, 8]
let evenNum = { (number: Int) -> Bool in
return number % 2 == 0
}
let oddNum = { (number: Int) -> Bool in
return number % 2 == 1
}
// hasElements(in: λ§€κ°λ³μλ‘ κ²μ¬ν λ°°μ΄ match: λ§€κ°λ³μλ‘ κ²μ¬λ₯Ό μ€νν ν΄λ‘μ λ₯Ό λ°μλ€μ
func hasElements(in array: [Int], match predicate: (Int) -> Bool) -> Bool {
return withoutActuallyEscaping(predicate, do: { escapablePredicate in
return (array.lazy.filter { escapablePredicate($0) }.isEmpty == false)
})
}
let hasEvenNum = hasElements(in: numbers, match: evenNum)
let hasOddNum = hasElements(in: numbers, match: oddNum)
print(hasEvenNum) //true
print(hasOddNum) //false
μλ ν΄λ‘μ
ν¨μμ μ λ¬μΈμλ‘ μ λ¬ν ννμ μλμΌλ‘ λ³νν΄μ£Όλ ν΄λ‘μ μ΄λ€
- μλ ν΄λ‘μ λ μ λ¬μΈμλ₯Ό κ°μ§ μλλ€
- νΈμΆλμμ λ μμ μ΄ κ°μΈκ³ μλ μ½λμ κ²°κ΄κ°μ λ°ννλ€
var customer: [String] = ["Bonny", "yeonsu", "Jhon"]
func serveCustomer(_ customerProvider: @autoclosure () -> String) {
print("Now serving \(customerProvider())!")
}
serveCustomer(customer.removeFirst()) //Now serving Bonny!