ABOUT ME

-

  • [Swift] 클로저 (Closures)
    카테고리 없음 2022. 12. 2. 11:55

    https://jusung.gitbook.io/the-swift-language-guide/language-guide/07-closures

     

    클로저 (Closures) - The Swift Language Guide (한국어)

    위 코드는 각 자리수를 구해서 그 자리수를 문자로 변환하고, 10으로 나눠서 자리수를 바꾸며 문자로 변환하는 것을 반복합니다. 이 과정을 통해 숫자 배열을, 문자 배열로 바꿀 수 있습니다. numb

    jusung.gitbook.io

    import UIKit
    
    //String 을 반환하는 클로저
    let myName : String = {
        //myName으로 들어간다
        return "단비"
    }()
    
    print(myName)
    
    //클로저 정의
    //받은 매개변수 타입 지정해주고 최종적으로 리턴해주는 값을 in 을 붙임
    let myRealName : (String) -> String = { (name: String) -> String in
        return "개발하는 \(name)"
    }
    
    myRealName("단비")
    
    //return이 없는 void 상태로 반환하기
    let myRealNameLogic : (String) -> Void = { (name: String) in
        print("개발하는 \(name)")
    }
    
    myRealNameLogic("단비")

    출력결과

    단비
    개발하는 단비

     


     

    매개변수로서의 클로저

    import UIKit
    
    // () -> Void 반환하는 타입이 없음
    func completion(){
    }
    
    //completion 이라는 클로저를 매개변수로 가지는 메소드 정의
    func sayHi(completion: () -> Void){
        print("sayHi() called")
        sleep(2) //2초 멈추기
        completion()
    }
    
    //메소드 호출부 에서 이벤트 종료를 알 수 있다.
    sayHi(completion: {
        print("2초가 지났다. 1")
    })
    
    sayHi(){
        print("2초가 지났다. 2")
    }
    
    sayHi(){
        print("2초가 지났다. 3")
    }
    
    //매개변수로서 데이터를 반환하는 클로저
    func sayHiWithName(completion: (String) -> Void){
        print("sayHiWithName() called")
        sleep(2)
        //클로저를 실행과 동시에 데이터 반환
        completion("오늘도 빡코딩")
    }
    
    sayHiWithName(completion: { (comment: String) in
        print("2초 뒤 그가 말했다. ", comment)
    })
    
    sayHiWithName(completion: { comment in
        print("2초 뒤 그가 말했다. ", comment)
    })
    
    sayHiWithName {
        print("2초 뒤 그가 말했다. ", $0)
    }
    
    //여러개의 데이터를 여러개 반환하는 클로저
    func sayHiWithFullName(completion: (String, String) -> Void){
        print("sayHiWithFullName() called")
        sleep(2)
        //클로저를 실행과 동시에 데이터 반환
        completion("오늘도 빡코딩", "화이팅")
    }
    
    sayHiWithFullName {
        first, second in
        print("첫번째 : \(first), 두번째 :\(second)")
    }
    
    sayHiWithFullName {
        print("첫번째 : \($0), 두번째 :\($1)")
    }
    
    //기본형은 없다
    func sayHiOptional(completion: (() -> Void)? = nil){
        print("sayHiOptional() called")
        sleep(2)
        completion?()
    }
    
    
    sayHiOptional()
    
    //비동기로 처리할때 이벤트를 컴플레션 클로저를 넣어서 완료됐다는걸 전달하고 싶을때 사용함
    // 클로저 자체를 nil 로 만들면 됨
    sayHiOptional(completion: {
        print("2초가 지났다.")
    })
    
    // _ 언더바는 생략이라는 의미임
    // 매개변수를 받고 싶지 않을때 매개변수 자리에 언더바를 쓰면 됨
    
    var Numbers : [Int] = [0, 1, 2, 3, 4, 5]
    
    var transformedNumbers_1 = Numbers.map { aNumber in
        return "숫자 : \(aNumber)"
    }
    
    var transformedNumbers_2 = Numbers.map { (aNumber: Int) -> String in
        return "숫자 : \(aNumber)"
    }
    
    var transformedNumbers_3 = Numbers.map{
        return "숫자: \($0)"
    }

    출력 결과

    sayHi() called
    2초가 지났다. 1
    sayHi() called
    2초가 지났다. 2
    sayHi() called
    2초가 지났다. 3
    sayHiWithName() called
    2초 뒤 그가 말했다.  오늘도 빡코딩
    sayHiWithName() called
    2초 뒤 그가 말했다.  오늘도 빡코딩
    sayHiWithName() called
    2초 뒤 그가 말했다.  오늘도 빡코딩
    sayHiWithFullName() called
    첫번째 : 오늘도 빡코딩, 두번째 :화이팅
    sayHiWithFullName() called
    첫번째 : 오늘도 빡코딩, 두번째 :화이팅
    sayHiOptional() called
    sayHiOptional() called
    2초가 지났다.

    댓글

Today
Designed by Danbee Park.