카테고리 없음

[Swift] 클로저 (Closures)

단비_danbee 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초가 지났다.