programing

Swift에서 Arg 수가 가변인 함수에 배열 전달

newsource 2023. 4. 15. 08:55

Swift에서 Arg 수가 가변인 함수에 배열 전달

Swift Programming Language에는 다음과 같이 표시됩니다.

함수는 변수 개수의 인수를 배열로 수집할 수도 있습니다.

  func sumOf(numbers: Int...) -> Int {
      ...
  }

이러한 함수를 쉼표로 구분된 번호 리스트('sumOf(1, 2, 3, 4)')로 호출하면 함수 내 배열로 사용할 수 있습니다.

질문: 이 함수에 전달하고 싶은 번호 배열이 이미 있으면 어떻게 합니까?

let numbers = [1, 2, 3, 4]
sumOf(numbers)

이 오류는 "제공된 인수를 받아들이는 '_conversion'에 대한 오버로드를 찾을 수 없습니다."라는 컴파일러 오류로 인해 실패합니다.기존 어레이를 가변 함수에 전달할 수 있는 요소 목록으로 변환하는 방법이 있습니까?

개발자가 확인한 바와 같이, 스플래팅은 아직 언어로 되어 있지 않습니다.현재 해결 방법은 오버로드를 사용하거나 오버로드를 추가할 수 없는 경우 대기하는 것입니다.

여기 제가 발견한 작품이 있습니다.네가 원하는 건 아니지만 효과가 있는 것 같아

1단계: variadic 인수 대신 배열로 원하는 함수를 선언합니다.

func sumOf(numbers: [Int]) -> Int {
    var total = 0
    for i in numbers {
        total += i
    }
    return total
}

스텝 2: 바리에딕 함수 내에서 호출합니다.

func sumOf(numbers: Int...) -> Int {
    return sumOf(numbers)
}

순서 3: 어느 쪽이든 콜:

var variadicSum = sumOf(1, 2, 3, 4, 5)
var arraySum = sumOf([1, 2, 3, 4, 5])

이상하게 들리지만, 제 테스트에서는 효과가 있어요.이것이 누군가에게 예상치 못한 문제를 일으키면 알려주세요.Swift는 동일한 함수명으로 두 호출의 차이를 구분할 수 있을 것으로 보입니다.

또한 이 방법에서는 @manojid의 답변대로 Apple이 언어를 업데이트 할 경우 이러한 기능만 업데이트하면 됩니다.그렇지 않으면 여러 번 이름을 변경해야 합니다.

다음 기능을 캐스팅할 수 있습니다.

typealias Function = [Int] -> Int
let sumOfArray = unsafeBitCast(sumOf, Function.self)
sumOfArray([1, 2, 3])

도우미 기능은 다음과 같이 사용할 수 있습니다.

func sumOf (numbers : [Int])  -> Int { return numbers.reduce(0, combine: +) }
func sumOf (numbers : Int...) -> Int { return sumOf (numbers) }

이 작업을 수행했습니다(래퍼 + 아이덴티티 매핑):

func addBarButtonItems(types: REWEBarButtonItemType...) {
    addBarButtonItems(types: types.map { $0 })
}

func addBarButtonItems(types: [REWEBarButtonItemType]) {
    // actual implementation
}

이 답변이 당신의 질문에 대한 정확한 답변은 아니라는 것을 알지만, 주목할 가치가 있다고 생각합니다.나도 스위프트와 경기를 시작하던 중 바로 비슷한 질문을 받았다.Manojlds의 답변이 당신의 질문에 더 나은 것 같습니다. 동의하지만, 다시 한 번 말씀드리지만, 제가 생각해낸 다른 해결 방법이 있습니다.나도 로건이 더 좋은 것 같아.

저 같은 경우에는 어레이를 전달하고 싶었을 뿐입니다.

func sumOf(numbers: Array<Int>) -> Int {
    var sum = 0
    for number in numbers {
        sum += number
    }
    return sum
}

var someNums = [8,7,2,9,12]
sumOf(someNums)
sumOf([10, 15, 20])

다른 사람들이 나처럼 생각할까 봐 말해주고 싶었어대부분의 경우 이렇게 어레이를 넘기고 싶지만 아직 '신속하게'는 생각하지 않습니다. :)

스위프트 5

은 이방의 입니다.@dynamicCallable 또는 '''를 할 수 unsafeBitCast요.struct★★★★★★★★★★★★★★★★★★:

@dynamicCallable
struct SumOf {
    func dynamicallyCall(withArguments args: [Int]) -> Int {
        return args.reduce(0, +)
    }
}

let sum = SumOf()

// Use a dynamic method call.
sum(1, 2, 3) // 6

// Call the underlying method directly.
sum.dynamicallyCall(withArguments: [1, 2, 3]) // 6

언급URL : https://stackoverflow.com/questions/24024376/passing-an-array-to-a-function-with-variable-number-of-args-in-swift