HIT해

[Swift 기초문법 - 11] 매개변수로서 클로저 본문

Swift/Swift 기초문법

[Swift 기초문법 - 11] 매개변수로서 클로저

힛해 2024. 7. 11. 03:29
728x90

앞선 포스팅에서 설명한 클로저를 매개변수로 담는 방법이 있다.

왜 굳이..?

함수안에서 사용하는 기능을 매개변수로 집어넣으면서 코드 가독성이 좋아질 수 있다.

 

func sayHi(completion : (Int) -> Int){
    print("sayHi called")
    sleep(1)
    completion(2)
}

var total = 0

let plus : (Int) -> Int = {
    
    total += $0
    print("total :",total)
    return total
}

sayHi(completion: plus)
sayHi(completion: plus)
sayHi(completion: plus)

print(total)

 

일반적으로 completion으로 선언하고 매개변수와 반환 타입을 설정하고 그에 맞는 클로저를 함수의 매개변수로 집어넣어주면 된다.

 

실행결과

 

함수를 호출했지만 closer를 활용하여 외부변수의 값도 변경되는 것을 알 수 있다.

 

저는 plus라는 closer를 선언해두고 사용했지만 다른 방법으로 호출할 수도 있습니다!

 

호출방법

func sayHi(completion : (Int) -> Int){
    print("sayHi called")
    sleep(1)
    completion(2)
}

var result = 0

sayHi(completion: { (number : Int) in
    print(result)
    result += number+1
    return result
    
})

// 자료형 생략
sayHi(completion: { number in
    print(result)
    result += number+1
    return result
    
})

// 매개변수를 지우고 아예 블럭으로
sayHi{ number in
    print(result)
    result += number+1
    return result
}

// 순서를 알고 있다면
sayHi{
    print(result)
    result += $0+1
    return result
}

print(result)

 

실행결과

 

클로저 옵셔널 처리

클로저를 매개변수로 받거나 안받거나 하고싶을때의 방법이다!

func sayHi(completion : ((Int) -> Int)? = nil){
    print("sayHi called")
    sleep(1)
    completion?(2)
}

sayHi()

sayHi{
    print("\($0)")
    return $0+1
}

 

매개변수 타입 앞에 '(' 로 한번 묶어주고 반환타입 ')' 뒤에 옵셔널 처리를 해주고 초기값을 설정해준다.

그리고 함수내에서 사용되는 클로저를 옵셔널처리 해주면 된다!

 

실행결과

 

추가적으로 map과 같은 fillter에도 사용되고 closer기 때문애 블록형태로 바꿔서 활용할 수도 있다!

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

var tmp = Numbers.map{
	return $0
}

 

아주아주 즐거운 개념이다!

 

이를 이해하면 연산자나 콜렉션에서 잘 활용할 수 있다!