iOS/Swift

[Swift] ν΄λ‘œμ €

year.number 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!