In der Swift-Programmiersprache heißt es:
Funktionen können auch eine variable Anzahl von Argumenten annehmen und diese in einem Array sammeln.
func sumOf(numbers: Int...) -> Int { ... }
Wenn ich eine solche Funktion mit einer durch Kommas getrennten Liste von Zahlen (`sumOf (1, 2, 3, 4)) aufrufe, werden sie als Array innerhalb der Funktion verfügbar gemacht.
Frage: Was ist, wenn ich bereits ein Array von Zahlen habe, die ich an diese Funktion übergeben möchte?
let numbers = [1, 2, 3, 4]
sumOf(numbers)
Dies schlägt mit dem Compilerfehler fehl, "Es konnte keine Überladung für '__conversion' gefunden werden, die die angegebenen Argumente akzeptiert". Gibt es eine Möglichkeit, ein vorhandenes Array in eine Liste von Elementen umzuwandeln, die ich an eine variable Funktion übergeben kann?
swift
variadic-functions
Ole Begemann
quelle
quelle
Antworten:
Splatting ist noch nicht in der Sprache , wie von den Entwicklern bestätigt. Problemumgehung besteht derzeit darin, eine Überladung zu verwenden oder zu warten, wenn Sie keine Überladungen hinzufügen können.
quelle
sumOf(...numbers)
print
!Hier ist eine Arbeit, die ich gefunden habe. Ich weiß, es ist nicht genau das, was Sie wollen, aber es scheint zu funktionieren.
Schritt 1: Deklarieren Sie die gewünschte Funktion mit einem Array anstelle von variadischen Argumenten:
Schritt 2: Rufen Sie dies innerhalb Ihrer variadischen Funktion auf:
Schritt 3: Rufen Sie so oder so an:
Es scheint seltsam, aber es funktioniert in meinen Tests. Lassen Sie mich wissen, ob dies für jemanden unvorhergesehene Probleme verursacht. Swift scheint in der Lage zu sein, den Unterschied zwischen den beiden Aufrufen mit demselben Funktionsnamen zu trennen.
Wenn Apple bei dieser Methode die Sprache gemäß der Antwort von @ manojid aktualisiert, müssen Sie nur diese Funktionen aktualisieren. Andernfalls müssen Sie viel umbenennen.
quelle
Sie können die Funktion umwandeln:
quelle
func sumOf(foo numbers: Int..., bar: Bool) -> Int {};
erforderttypealias Function = (foo: [Int], bar: Bool) -> Int;
unsafeBitCast
. Dies mag heute funktionieren, aber wenn eine Referenz dies nicht sagt, kann die nächste Version des Compilers hier buchstäblich alles tun (Compilerfehler / Absturz / zufälliges Ausführen von Code ...). Schauen Sie sich die ernsthaft aussehende Warnung auf unsafeBitCast an .Sie können eine Hilfsfunktion als solche verwenden:
quelle
Int...
und nicht (leicht) geändert werden kann?apply
Prozedur. Ich nehme an, einige Leute nennen das "Splattern".sumArray
hier verwiesen?Ich weiß, dass diese Antwort Ihre genaue Frage nicht beantwortet, aber ich denke, es ist erwähnenswert. Auch ich begann mit Swift zu spielen und stieß sofort auf eine ähnliche Frage. Manojlds Antwort ist besser für Ihre Frage, ich stimme zu, aber auch hier eine andere Problemumgehung, die ich mir ausgedacht habe. Ich mag Logans auch besser.
In meinem Fall wollte ich nur ein Array übergeben:
Ich wollte nur teilen, falls jemand anders wie ich dachte. Die meiste Zeit würde ich es vorziehen, das Array so zu übergeben, aber ich denke das "Swiftly" noch nicht. :) :)
quelle
Ich habe dies getan (Wrapper + Identity Mapping):
quelle
Swift 5
Dies ist ein Ansatz mit einer
@dynamicCallable
Funktion, mit der eine ÜberlastungunsafeBitCast
vermieden werden kann. Sie sollten jedoch einen bestimmtenstruct
Aufruf vornehmen :quelle