Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] parameter packs 개념 (Variadic parameter, repeat each, each) 본문

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 개수만큼 그대로 튜플로 리턴해주고 싶은 경우 일일이 써주어야하는 번거로움이 존재

https://github.com/apple/swift-evolution/blob/main/proposals/0393-parameter-packs.md#motivation

  • 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

Comments