2016-07-21 12 views
0

Das folgende Code-Snippet wird aus der official document kopiert, wo es verwendet wird, um zu demonstrieren, wie die Extensions verwendet werden, um Methoden zu vorhandenen Typen hinzuzufügen.Vom Beispielcode verwirrt, der den Typen neue Instanzmethoden hinzufügt

extension Int { 
    func repetitions(task:() -> Void) { 
     for _ in 0..<self { 
      task()//what's going on here? 
     } 
    } 
} 

3.repetitions { //why I don't have to call as `repetitions()` 
    print("Hello!") 
} 

Frage: Die Frage stellt sich nicht, wie die extinsion extens. Ich bin nur ein wenig verwirrt über diesen Code, warum sieht das so aus? warum verwenden Sie task() innerhalb des Funktionskörpers? Woher kommt es? für die Linie 3.repetition warum schreiben sie nicht als 3.repetition()

Vielen Dank

+1

'task' ist der Name eine Funktion. 'task()' ruft diese Funktion auf. – matt

+0

@matt Q1: du meinst die Funktion wie "print (" hallo! ")"? Q2: Hat es etwas mit der 'task' zu tun (Aufgabe: () -> Void) Vielen Dank – SLN

+1

Es ist diese 'Aufgabe'. Der in diese Funktion übergebene Parameter ist eine Funktion. Wir dürfen unserem Parameter einen beliebigen Namen geben, den wir wollen. Wir nennen ihn 'Aufgabe'. – matt

Antwort

3

repetitions ist eine Funktion, die als Parameter eine Funktion und Anrufe annimmt, die mehrmals funktionieren.

repetitions zu nennen, sagen wir konnten (beachten Sie, diese 3 Swift ist):

func sayHi() { 
    print("Hello") 
} 
3.repetitions(task:sayHi) 

Aber warum definieren einen zusätzlichen Namen sayHi? Stattdessen verwenden wir eine anonyme Funktion:

3.repetitions(task:{print("Hello"}) 

Aber in diesem Fall sind wir die Klammer in diesem Aufruf zu repetitions und Hinter Syntax weglassen erlaubt:

3.repetitions{print("Hello")} 
1

Warum Gebrauch Aufgabe () innerhalb des Funktionskörpers?

Der task Parameter wird als Verschluss aka eine anonyme Funktion definiert:

task:() -> Void 

Diese besagt, dass die Funktion eine andere Funktion als Parameter erwartet, eine, die keine Werte keine Argumente und gibt nimmt.

task() Aufruf ruft diese Funktion, die übergeben wird.

für die Linie 3.repetition warum schreiben sie nicht als 3.repetition()

Suche nach "Rollier Closure Syntax". Wenn das letzte Argument einer Swift-Funktion eine Closure ist, können Sie es an den Aufruf außerhalb der Argumentliste () anhängen. Oder mit anderen Worten, das ist genau das gleiche:

3.repetitions(task: { 
    print("Hello!") 
}) 

(ob Sie task: verwenden als das Schlüsselwort Argument davon ab, ob Sie Swift verwenden 2 oder 3.