밤에 쓴 코드

Swift) Closure - 클로저 본문

Swift

Swift) Closure - 클로저

붱이🦉 2019. 5. 8. 23:02

클로저 - Closures

클로저는 자신이 선언된 컨텍스트로부터 상수나 변수 저장하고, 붙잡아 둘수 있습니다.


  • 클로저의 형태

    • 전역함수이름을가진 클로저의 형태이고 , 값을 붙잡아 둘 수 없습니다.
    • 중첩함수이름을 가진 클로저의 형태이고 , 자신을 가지고 있는 함수의 값을 붙잡아 둘 수 있습니다.
    • 클로저표현식이름을 가지지 않은 클로저의 형태이고 , 자신 주위 컨텍스트의 값을 붙잡아 둘 수 있습니다.
  • Closure Expression Syntax - 클로저 표현식

  • { (parameters) -> return type in
        statements
    }

정수형 배열을 문자열 배열로 변환하기

  • 함수를 이용한 정렬

  • var numbers = [9,3,2,4,1,5,8,7,6,0]
    
    func asendingOrder(_ a:Int,_ b:Int) -> Bool {
        return a < b
    }
    numbers.sorted(by: asendingOrder(_:_:))
  • 클로저 표현식으로 정렬

  • numbers.sorted(by:{ (a:Int,b:Int) -> Bool in  return a < b })
  • 매개변수 타입생략

  • numbers.sorted(by: { a,b in return a < b } )
    // sort에 들어올 클로저 타입이 명시 되어 있으므로 생략가능하다.
  • 단일 표현식에서의 반환 생략

  • numbers.sorted(by:{ a,b in a < b})
    // 단순한 표현식일시 return 키워드 생략이 가능하다.
  • 트레일링 클로저 표현

  • numbers.sorted{ a,b in a < b }
    // 매개변수로 클로저를 받을시 마지막 매겨변수가 클로저이면 트레일링 클로저로 표현할 수 있다.
  • 속기 이름 표현

  • numbers.sorted{ $0 < $1 }

Escaping Closures

  • var store = [ () -> Void ]()
    
    func callEscapingClosure(closure: @escaping () -> Void ){
        store.append(closure)
        closure()
    }
    
    store.append{ print(10) }
    
    // 탈출 가능한 클로저를 만드는 방법은 외부변수에 저장하는 것입니다.
  • 구조체에서 사용해보기

  • func callEscapingClosure(closure:  @escaping () -> Void ){
        store.append(closure)
        closure()
    }
    func callNonEscapingClosure(closure: () -> Void ){
        closure()
    }
    
    struct Escaping{
         let x = 10
         func test(){
            callEscapingClosure {
                print(self.x) 
               // @escaping 에서 self 명시적으로 참조해야 함을 의미합니다 
               // 외부의 클로저이므로 self 키워드를 붙여주지 않으면 x 의 컨텍스트를 가늠할 수 없다.
            }
            callNonEscapingClosure {
                print(x)
            }
    
        }
    }
    Escaping().test()

Auto Closures

  • 매개변수를 가지고 있지 않다.
  • 호출될 때 까지 실행되지 않는다.
var waitingCustomers = ["부엉이","올빼미","금붕어","병아리","아기상어"]
let currentCustomer = {  waitingCustomers.remove(at: 0) } // Auto closure
let newCustomer = { waitingCustomers.append($0) }

func nextCustomer(  process: @autoclosure () -> String){
    print("현재손님은 \(process())")
}

newCustomer("오리")  // 호출되어 실행 
print(watingCustomers)  // print: ["부엉이", "올빼미", "금붕어", "병아리", "아기상어", "오리"]
nextCustomer(process: currentCustomer()) // print: 현재손님은 부엉이
print(watingCustomers)  // print: [올빼미", "금붕어", "병아리", "아기상어", "오리"]
nextCustomer(process: currentCustomer()) // print: 현재손님은 올빼미
print(watingCustomers)  // print: ["금붕어", "병아리", "아기상어", "오리"]

'Swift' 카테고리의 다른 글

Swift ) 제네릭  (0) 2019.06.17
Swift) 사용자 정의 연산자  (0) 2019.06.17
Swift) POP - Protocol Oriented Programming  (1) 2019.04.25
Swift) Extension - 익스텐션  (0) 2019.04.25
Swift) 옵셔널 - Optional  (0) 2019.04.18
Comments