-
[Swift] ν΄λ‘μ iOS/Swift 2022. 8. 9. 22:55
π‘ ν΄λ‘μ
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!
'iOS > Swift' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Swift] λ§΅, νν°, 리λμ€(map, filter, reduce) (0) 2022.08.15 [Swift] μ΅μ λ 체μ΄λ(Optional Chaining) (0) 2022.08.11 [Swift] μ κ·Ό μ μ΄ (0) 2022.08.05 [Swift] λλ€ μ«μ λ§λλ λ°©λ²(Randomisation) (0) 2022.08.04 [Swift] μΈμ€ν΄μ€(instance) (0) 2022.08.03