2017-04-11 3 views
0

Ich machte eine Methode, die eine Integer- und Boolesche Methode als Argument übergeben (Diese Methode benötigt eine ganze Zahl als Argument). Als ich diese Methode aufgerufen und die Integer- und Boolean-Methode übergeben habe, funktionierte der Code, ohne dass ich die ganze Zahl in der booleschen Methode übergeben musste, warum ist das so?In einer Methode, die eine andere Methode als Argument übergibt, warum benötigt das übergebene Argument nicht sein übergebenes Argument?

(Der folgende Code nicht mein eigenes ist und von der Apple-Einführung in Swift Ressource genommen)

func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool{ 

    for item in list{ 
     if condition(item){ 
      return true 
     } 
    } 
    return false 
} 

func lessThanTen(number:Int) -> Bool{ 
    return number < 10 
} 

var numbers = [20,19,2,30,12] 
hasAnyMatches(list: numbers, condition: lessThanTen) 

Zum Beispiel in diesem Fall muss lessThanTen eine ganze Zahl als Argument übergeben werden, doch wenn ich rufe hasAnyMatches Ich habe keine ganze Zahl an lessThanTen übergeben. Warum funktioniert der Code trotzdem?

+0

Die Funktion selbst wird als Argument übergeben. Es wird dann bei "if condition (item) {...)" aufgerufen –

Antwort

2

Sie müssen zuerst verstehen, was wirklich ist eine Methode/Funktionsreferenz.

Normalerweise, wenn Funktionen an Anfänger unterrichtet werden, würden einige Leute die Funktion Maschine Analogie verwenden. Hoffentlich hast du davon gehört. Eine Funktion ist wie eine Maschine. Es nimmt einige Eingaben (Parameter), verarbeitet die Eingaben und spuckt etwas aus (Rückgabewert). Und es gibt viele dieser Maschinen in einem Programm.

Eine Funktionsreferenz ist in dieser Analogie wie ein Pfeil, der auf die Funktionsmaschine zeigt. Es ist wie "diese Maschine zu sagen!" oder "diese Maschine da drüben!".

Warum brauchen Sie die Parameter nicht?

Da die Parameter einer Funktion von der Funktion geliefert werden, die die Funktionsreferenz übernimmt. Wenn die Parameter vom Aufrufer geliefert würden, hätte es keinen Sinn, eine Funktionsreferenz zu übergeben, oder?

Lassen Sie uns diesen Code betrachten:

func add(a: Int, b: Int) -> Int { return a + b } 

func someFunc(_ param: (Int, Int) -> Int) { 
    // some code 
} 

Aufruf someFunc mit add(a: 1, b: 2) ist hier sinnlos, weil man einfach 3 stattdessen schreiben konnte. Aber wenn Sie add übergeben, kann someFuncadd mit jedem gewünschten Parameter aufrufen.

1

Es ist ziemlich klar aus Ihrer Methode Definition:

for item in list{ 
    if condition(**item**){ 
    return true 
    } 
} 

Sie senden Element (Int) aus der Liste Array Zustand Methode.

Verwandte Themen