[swift]11. 매개변수로서 클로저

RudinP·2023년 9월 14일
0

Study

목록 보기
30/227

요즘은 운전면허를 따느라 정신이 없다.
다행히도 이번주에 필기 및 장내기능은 한번에 합격했고,
다음주에 도로주행을 볼 예정이다. 이것도 한 번에 합격했으면 좋겠다.


11. 매개변수로서 클로저

  • 연산자(콜렉션에서 사용) ex: map
  • 이벤트 사용

처음 봤을때 무슨 개념인지 몰랐는데, 따로 서치해보니 클로저는 익명함수라고한다.
액션같은 개념인듯 했다. (람다함수~)
독특하게도, 이 익명함수를 매개변수로 받는 함수를 만들 수 있다.
그래서 더 헷갈렸던듯...ㅎㅎ
그냥 파라미터에 Int, String 넣는 것처럼 함수를 넣어준다고 생각하면 쉽다.

매개변수가 없고, Void인 클로저

//클로저를 매개변수로 가지는 메소드 정의. completion이라는 클로저인것.
func sayHi(completion: () -> Void){
    print("sayHi() called")
    sleep(2)
    completion()
}
  • 호출
//메소드 호출부 에서 이벤트 종료를 알 수 있다.
sayHi(completion: {
    print("2초가 지났다. 1")
})

sayHi(){
    print("2초가 지났다. 2")
}

sayHi{
    print("2초가 지났다. 3")
}

매개변수가 있고, Void인 클로저

//매개변수로서 데이터를 반환하는 클로저 선언
func sayHiWithName(completion: (String) -> Void){
    print("sayHiWithName() called")
    sleep(2)
    completion("오늘도 빡코딩 하고 계신가요")
}
  • 호출
//호출
sayHiWithName(completion: { (comment: String) in
    print("2초 뒤에 그가 말했다! comment:", comment)
})

sayHiWithName(completion: { comment in print("2초 뒤에 그가 말했다! comment:", comment)})

sayHiWithName{comment in print("2초 뒤에 그가 말했다! comment:", comment)}

sayHiWithName{print("2초 뒤에 그가 말했다! comment:\($0)")}

클로저의 데이터가 여러개인 경우

//클로저의 데이터가 여러개인 경우
func sayHiWithFullName(completion : (String, String) -> Void){
    print("sayHiWithFullName() called")
    sleep(2)
    completion("a","b")
}
  • 호출
sayHiWithFullName(completion:{(first: String, second: String) in
    print("첫번째: \(first), 두번째: \(second)")})

sayHiWithFullName(completion: { first, second in print("첫번째: \(first), 두번째: \(second)")})

sayHiWithFullName{print("첫번째: \($0), 두번째: \($1)")}

//만약에 매개변수 두개 중 하나라도 안 쓰고 싶은 경우 언더바 쓰기
sayHiWithFullName{_, second in print("두번째: \(second)")}

매개변수인 클로저를 옵셔널로

//클로저를 생략하고 싶은 경우?-> completion을 옵셔널로
func sayHiOptional(completion: (()-> Void)? = nil){ //옵셔널
    print("sayHi() called")
    sleep(2)
    completion?() //옵셔널
}
  • 호출
sayHiOptional() //이벤트 출력 안하고싶다.

sayHiOptional(completion:{
    print("hahahaha")
})

클로저를 일반적인 함수로 표현할 경우

//클로저를 일반적인 함수로 표현할 경우
//(String) -> Void
func completion(userInput: String){
    
}
//(String, String) -> Void
func completion(first: String, second: String){
    
}

//(Int) -> String
func transform(number: Int) -> String{
    return "숫자 :\(number)"
}

collection mapping

//collection mapping

var numbers:[Int] = [0,1,2,3,4,5]

//map => 해당 클로저를 적용
var transformedNumbers = numbers.map{aNumber
    in return "숫자:\(aNumber)"}

var transformedNumbers2 = numbers.map{return "숫자: \($0)"}
  • 백준에서 입력값을 변환할 때 사용
profile
곰을 좋아합니다. <a href = "https://github.com/RudinP">github</a>

0개의 댓글