개발콩블로그

[Swift] Parameter packs 본문

swift

[Swift] Parameter packs

devBean 2025. 2. 12. 21:37

안녕하세요!

개발콩입니다. 오늘은 Parameter packs 대해서 알아보도록 하겠습니다.

 

Swift 5.9에서 Parameter Packs라는 개념이 도입되었습니다.

왜 등장하게 되었는지, 또한 어떻게 사용하는 지에 대해 정리하기 위해서 글을 작성합니다.

 

 

Parameter packs 등장이유

여러 숫자에 1을 더하는 함수를 만든다고 가정을 했을 때 기존에는 overloading을 활용하여 사용할 수 있었습니다.

func addOne(num: Int) -> Int {
    return num + 1
}

func addOne(num1: Int, num2: Int) -> (Int, Int) {
    return (num1 + 1, num2 + 1)
}

func addOne(num1: Int, num2: Int, num3: Int) -> (Int, Int, Int) {
    return (num1 + 1, num2 + 1, num3 + 1)
}

 

 

 

우리는 여러개의 매개변수를 전달할 때 variadic parameter(가변 매개변수)를 이용할 수 있습니다.

func addOne(nums: Int...) -> ???

 

하지만 반환값으로 매개변수의 개수와 같은 튜플을 반환하고 싶을 때 반환 유형을 선언할 방법이 없었습니다.

 

 

func addOne<T: Numeric>(nums: T...) -> ???

또한, 제네릭을 이용하여 원하는 타입의 인자를 받을 경우 타입을 보존할 수 없는 단점 또한 발생합니다.

그렇기 각 인수의 개수마다 반환 타입을 다르게 만들 수도 없었습니다.

 

 

따라서 우리의 코드 중, parameter의 개수와 같은 튜플을 반환하기 위해서 overloading을 통해 중복해서 정의하고 있고

parameter의 입력 타입을 보존하여 튜플을 반환하고 싶을 때 사용할 수 있는 것이 Parameter packs 개념입니다.

 

 

Parameter Packs 사용방법

func addOne<each T: Numeric>(numbers: repeat each T) -> (repeat each T) {
    return (repeat each numbers + 1)
}

 

기존 제네릭을 표현하는 부분에 each 키워드를 사용합니다. 

여기서 제네릭 placeholder Name T를 명시적으로 사용하게 될 경우 단수형으로 사용하는 것을 권장하고 있습니다.

 

parameter type과 return type은 repeat each T로 표현합니다.

 

이후 반환은 튜플 형태로 반환해야하므로 repeat 키워드 밖은 소괄호로 감싸고,

각 인자 값들은 each를 붙여서 연산합니다.

 

func addOne<each T: Numeric>(numbers: repeat each T) -> (repeat each T) {
    return (repeat each numbers + 1)
}

let intOne: Int = 1
let doubleOne: Double = 1.0
let result = addOne(numbers: intOne, doubleOne)

print(result) // (2, 2.0)
print(type(of: result.0)) // Int
print(type(of: result.1)) // Double

 

parameter packs을 사용하게 되면서, 인수 개수와 동일한 튜플을 반환받을 수 있으며 type 또한 유지되는 것을 확인할 수 있었습니다.

 

 

 

참고자료

https://developer.apple.com/videos/play/wwdc2023/10168/