2014-06-08 6 views

Antwort

58

Der aktuelle Compiler tut Standardparameter in der Mitte einer Parameterliste ermöglichen.

screenshot of Playground

Sie können die Funktion wie folgt aufrufen, wenn Sie den Standardwert für den first Parameter verwenden möchten:

f(1) 

Wenn Sie einen neuen Wert für den first Parameter, Verwendung zuzuführen seine externen Namen:

f(first: 3, 1) 

Die Dokumentation explains, die wit Parameter h ein Standardwert wird automatisch mit einem externen Namen versehen:

Swift bietet einen automatischen externen Namen für jeden von Ihnen definierten Standardparameter, wenn Sie selbst keinen externen Namen angeben. Der automatische externe Name ist derselbe wie der lokale Name, als ob Sie vor dem lokalen Namen in Ihrem Code ein Hash-Symbol geschrieben hätten.

+1

Während diese Antwort technisch korrekt ist und Sie dies in Swift so machen können, ist es sehr verwirrend und sollte vermieden werden. Das Refactoring einer Funktion, um Standardparameter am Ende zu haben, ist nicht so viel Arbeit. Selbst in diesem einfachen Fall ist nicht ganz klar, was der Aufruf von "f (1)" bedeutet. [@ Connors Antwort] (http://stackoverflow.com/a/24102938/133166) sollte der akzeptierte sein. –

+1

@Rafael Ich habe nicht gesagt, dass dies die beste Praxis ist; Ich habe die Frage richtig beantwortet. Daher sollte dies die akzeptierte Antwort sein. – nathan

+1

@Rafael Swift 3 'f (1)' verursacht einen Fehler. – weakish

11

Sie sollten die Standardparameter am Ende der Parameterliste haben.

func f(second:Int, first:Int = 100){} 
f(10) 

Platz Parameter mit Standardwerten am Ende einer Parameterliste der Funktion. Dies stellt sicher, dass alle Aufrufe der Funktion die gleiche Reihenfolge für ihre nicht standardmäßigen Argumente verwenden, und stellt klar, dass die gleiche Funktion in jedem Fall aufgerufen wird.

Documentation link

+0

so Mit dem Parameter mit einem Standardwert vor denen, ohne sinnlos ist? Warum ist es kein Fehler bei der Kompilierung? – CarmeloS

+1

Nein, es ist nicht bedeutungslos, es stellt einfach nicht sicher, "dass alle Aufrufe der Funktion die gleiche Reihenfolge für ihre Nicht-Standardargumente verwenden". Es wird funktionieren, könnte aber verwirrend sein. Daher hat Apple den Entwicklern eine Richtlinie darüber gegeben, wo sie Parameter mit Standardwerten setzen können. –

0

Wenn es ein Verfahren für eine Klasse ist, müssen Sie es wie diese

class Test 
{ 
    func f(first:Int = 100, second:Int) 
    { 
     println("first is \(first)") 
     println("second is \(second)") 
    } 

    func other() 
    { 
     f(second: 4) 
     f(first: 30, second: 5) 
     //f(4) will not compile, and neither will f(9,12) 
    } 
} 

anrufen Ist die Funktion f global ist, können Sie es so nennen müssen:

f(4) 
f(first: 30, 5) 

Diese Drucke:

first is 100 
second is 4 
first is 30 
second is 5 
+0

Technisch benötigen Sie keine Bezeichnung für den erforderlichen Parameter. – nathan

+0

Ja, das tust du. Ich habe es ohne das Label versucht und es wird nicht kompilieren. –

+0

Siehe den Screenshot in meiner Antwort. – nathan

4

Auf Swift 3:

func defaultParameterBefore(_ x: Int = 1, y: Int) {} 

Aufruf

defaultParameterBefore(2) 

wird dieser Fehler erhöhen

error: missing argument for parameter 'y' in call 

Die einzige Ausnahme ist:

  • Es gibt einen Parameter vor dem Standardparameter ist;
  • und der Parameter nach dem Standardparameter ist ein Abschluss;
  • und der Abschlussparameter ist der letzte Parameter;
  • und Aufruf über Hinter Schließung

Zum Beispiel:

func defaultParameterBetween(_ x: Int, _ y: Bool = true, _ z: String) { 
    if y { 
     print(x) 
    } else 
     z() 
    } 
} 

// error: missing argument for parameter #3 in call 
// defaultParameterWithTrailingClosure(1, { print(0) } 

// Trailing closure does work, though. 
func defaultParameterWithTrailingClosure(_ x: Int, y: Bool = true, 
            _ z:() -> Void) { 
    if y { 
     print(x) 
    } else { 
     z() 
    } 
} 

defaultParameterWithTrailingClosure(1) { print(0) } 

rasche Version: DEVELOPMENT-SNAPSHOT-2016-04-12

+2

Ihr Codebeispiel funktioniert nicht. Sollte z ein Abschluss '() -> String' sein, anstelle eines' String'? – Binarian

+0

@iGodric Leider habe ich die Definition von 'defaultParameterWithTrailingClosure' vergessen. Jetzt behoben. – weakish

+0

Sie sagen also, Sie können etwas länger machen als die angenommene Antwort, es sei denn, es handelt sich um eine abschließende Schließung? – Honey