iOS 응용 (swift)
[iOS - swift] parameter packs 개념 (Variadic parameter, repeat each, each)
jake-kim
2024. 3. 8. 01:19
parameter packs 개념
- Swift 5.9에서 등장
- Swift 5.9미만에서는 아래와같이 여러개의 parameter가 있을때 이 parameter 개수만큼 그대로 튜플로 리턴해주고 싶은 경우 일일이 써주어야하는 번거로움이 존재

- parameter packs를 이용하면 아래처럼 한줄로 표현이 가능

- 또 기존에는 여러개의 parameter를 갖는것은 ... 으로 받을 수 있지만 return type에는 ... 연산자를 사용하지 못함
func f1(v1: Int) -> Int {
v1 + 1
}
func f2(v1: Int, v2: Int) -> (Int, Int) {
((v1 + 1), (v2 + 1))
}
func f3(v1: Int...) -> (Int...) { // Variadic parameter cannot appear outside of a function parameter list
}
parameter packs 사용 방법
- 아래 코드를 parameter packs으로 표현하면?
func f1(v1: Int) -> Int {
v1 + 1
}
func f2(v1: Int, v2: Int) -> (Int, Int) {
((v1 + 1), (v2 + 1))
}
- 1) pack 타입을 지정
- 기존에 generics표현하는 부분에 each 키워드를 붙여서 사용
func f<each T: Numeric>
- 2) 파라미터에 모든 타입들이 T로 명시
- 타입은 repeat each T 타입으로 표현
func f<each T: Numeric>(v: repeat each T)
- 리턴 타입 역시도 동일하므로 repeat each T로 명시
func f<each T: Numeric>(v: repeat each T) -> (repeat each T)
- 3) 리턴 타입에서는 각 파라미터 값마다 해주고 싶은 연산 후 리턴
- 튜플형태로 반환해야하므로 repeat 키워드 밖은 소괄호로 감싸고, 각 인자값들은 each를 붙여주어 연산
func f<each T: Numeric>(v: repeat each T) -> (repeat each T) {
(repeat (each v + 1))
}
완성)
let result = f(v: 1, 2, 3)
print(result) // (2, 3, 4)
* 참고
- https://github.com/apple/swift-evolution/blob/main/proposals/0393-parameter-packs.md