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
'programing' 카테고리의 다른 글
명령줄에서 VBScript를 사용하여 Outside Excel에서 Excel 매크로 실행 (0) | 2023.04.15 |
---|---|
테이블에서 필터 지우기 (0) | 2023.04.15 |
코드에서 동적 리소스 스타일을 할당하려면 어떻게 해야 합니까? (0) | 2023.04.15 |
Javascript의 PMT 함수 (0) | 2023.04.15 |
Apache POI의 컬럼 크기를 자동화하는 방법은 무엇입니까? (0) | 2023.04.15 |