ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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!

     

     

     

Designed by Tistory.