W języku szybkiego programowania mówi:
Funkcje mogą również pobierać zmienną liczbę argumentów, zbierając je w tablicę.
func sumOf(numbers: Int...) -> Int { ... }
Kiedy wywołuję taką funkcję z listą liczb oddzielonych przecinkami (sumOf (1, 2, 3, 4), są one udostępniane jako tablica wewnątrz funkcji.
Pytanie: co jeśli mam już tablicę liczb, które chcę przekazać do tej funkcji?
let numbers = [1, 2, 3, 4]
sumOf(numbers)
To kończy się niepowodzeniem z powodu błędu kompilatora: „Nie można znaleźć przeciążenia dla '__conversion', który akceptuje podane argumenty”. Czy istnieje sposób na przekształcenie istniejącej tablicy w listę elementów, które mogę przekazać do funkcji wariadycznej?
swift
variadic-functions
Ole Begemann
źródło
źródło
Odpowiedzi:
Splatting nie jest jeszcze w języku , co potwierdzają twórcy. Na razie obejściem jest użycie przeciążenia lub czekanie, jeśli nie możesz dodać przeciążeń.
źródło
sumOf(...numbers)
print
!Oto obejście, które znalazłem. Wiem, że to nie jest dokładnie to, czego chcesz, ale wydaje się, że działa.
Krok 1: Zadeklaruj żądaną funkcję za pomocą tablicy zamiast argumentów wariadycznych:
Krok 2: Wywołaj to z poziomu funkcji wariadycznej:
Krok 3: Zadzwoń w dowolny sposób:
Wydaje się dziwne, ale działa w moich testach. Daj mi znać, jeśli powoduje to nieprzewidziane problemy dla kogoś. Wydaje się, że Swift jest w stanie rozdzielić różnicę między dwoma wywołaniami o tej samej nazwie funkcji.
Ponadto, dzięki tej metodzie, jeśli Apple aktualizuje język, jak sugeruje odpowiedź @ manojid, wystarczy zaktualizować te funkcje. W przeciwnym razie będziesz musiał przejść i wiele zmienić nazwy.
źródło
Możesz przesłać funkcję:
źródło
func sumOf(foo numbers: Int..., bar: Bool) -> Int {};
wymagatypealias Function = (foo: [Int], bar: Bool) -> Int;
unsafeBitCast
. To może działać dzisiaj, ale jeśli nie mówi tak, następna wersja kompilatora może dosłownie zrobić wszystko tutaj (błąd kompilatora / awaria / losowe wykonanie kodu ...). Spójrz na poważnie wyglądające ostrzeżenie na stronie unsafeBitCast .Możesz użyć funkcji pomocniczej jako takiej:
źródło
Int...
i nie można jej (łatwo) zmienić?apply
procedurę. Niektórzy nazywają to „splataniem”.sumArray
tu mowa?Wiem, że ta odpowiedź nie odpowiada dokładnie na twoje pytanie, ale czuję, że warto ją odnotować. Ja też zacząłem bawić się Swiftem i od razu wpadłem na podobne pytanie. Odpowiedź Manojlda jest lepsza na twoje pytanie, zgadzam się, ale znowu mam inne obejście, które wymyśliłem. Tak się składa, że bardziej lubię Logana.
W moim przypadku chciałem tylko przekazać tablicę:
Chciałem się tylko podzielić, na wypadek gdyby ktoś inny pomyślał tak jak ja. Przez większość czasu wolałbym przekazywać tablicę w ten sposób, ale nie sądzę jeszcze, że opcja „Szybko”. :)
źródło
Zrobiłem to (Wrapper + Identity Mapping):
źródło
Szybki 5
Jest to podejście z
@dynamicCallable
funkcją, która pozwala uniknąć przeciążenia,unsafeBitCast
ale powinieneś zrobić konkretnystruct
sposób wywołania:źródło