2016-09-16 2 views
4

Ich frage mich, was miteinander zwei „ähnliche Funktionen“ unterscheidet und eindeutigWas genau unterscheiden zwei Funktionen in Swift?

werden kann

Dies ist, was ich gelernt habe aus Selbststudium

Die Einzigartigkeit kommt aus genannt: Funktionsname + Argument Ordnung und Argumentname + Rückgabetyp Die Kombination von ihnen muss eindeutig sein, um die Funktion eindeutig (Bitte siehe Beispiel unten)

  1. Nmu1 und Num2 würden dazu führen, zweideutig zu machen, weil der Rückgabetyp (nicht hat nicht den so Rückkehr Namen genannt schon der Name die Funktion als diese Rolle fungieren) bezeichnet nicht, wenn eine Funktion

  2. Obwohl Num3 Funktion hat einen anderen Parameter Namen zu nennen, wird es nicht eindeutig trennt es von der Funktion in Num1 und Num2. Da der Argumentname nicht referenziert wird, wenn die Funktion daher aufgerufen wurde, macht nur ein anderer Argumentname eine Funktion nicht eindeutig; Und die Funktion in Num4 unterscheidet sich mit allen oben genannten Funktionen, weil ihre Unterschrift Funktionsname + Argument Reihenfolge und Argumentname + Rückgabetyp ist einzigartig unter allen vorherigen 3 Funktionen.

  3. Num5 und Num6 Funktionen sind voneinander verschieden, denn sie unterschiedliche Argument Aufträge haben, wenn sie

    //Num1 
    func foo(guy name: String) -> String { 
        return "Hi \(name)" 
    } 
    
    //Num2 
    func foo(guy name: String) { 
        print("Hi \(name)") 
    } 
    
    //Num3 
    func foo(guy called: String) -> String { 
        return "Hi \(called)" 
    } 
    
    //Num4 
    func foo(dude name: String) -> String { 
        return "What's up \(name)" 
    } 
    
    //Num5 
    func foo(man name: String, from place: String) { 
        print("Hi! I'm \(name) I come from \(place)") 
    } 
    
    //Num6 
    func foo(from place: String, man name: String) { 
        print("Hi! I'm \(name) I come from \(place)") 
    } 
    

Frage definiert wurden: Ich vermisse vielleicht oder vielleicht falsch verstanden sogar einige Teile. Es wäre sehr nett von Ihnen, dass Sie mich korrigieren und die Teile hinzufügen Ich vermisste

Dank

[Update] Lassen Sie uns ein bisschen mehr über dieses Thema diskutieren. Lassen Sie uns mit der Frage beginnen, die the difference between Argument and Parameter diskutieren. Diese Frage macht hier sehr viel Sinn!

Zurück zu dem Zitat aus dem offiziellen Dokument swift

Jeder Funktionsparameter hat sowohl ein Argument Label und einen Parameternamen. Die Argumentbezeichnung wird beim Aufruf der Funktion verwendet; Jedes Argument wird in den Funktionsaufruf mit seiner Argumentbezeichnung davor geschrieben. Der Parametername wird bei der Implementierung der Funktion verwendet. Standardmäßig verwenden Parameter ihren Parameternamen als Argumentbezeichnung.

Argument, Parameter, Argument Labels und Parameternamen sind unterschiedlich. Der Unterschied kann hier zu Differentialfunktionen verwendet werden.

Funktionen mit gleichem Parameternamen, gleicher Parameterreihenfolge, gleichem Rückgabetyp und gleichem Funktionskörper können von verschiedenen Argument Labels unterschieden werden.

func foo(dude name: String) -> Int { 
    print("Hi \(name)!") 
    return 1 
} 

func foo(man name: String) -> Int { 
    print("Hi \(name)!") 
    return 1 
} 

//foo(dude: String) & foo(man: String) is identical when calling 

Für weitere Informationen wenden Sie sich bitte an Multiple functions with the same name

+1

Siehe http : //stackoverflow.com/questions/27690076/multiple-functions-with-the-same-name. –

+0

@MartinR Vielen Dank. Es hilft sehr! – SLN

Antwort

3

Definiert als Obj-C-kompatible Methoden können nicht Num1 und Num2 zusammen existieren, und Sie werden sie in NSObject Unterklasse haben Fehler definiert; jedoch können Sie sie als @nonobjc und Fehler markieren wird, weg da Swift Lage richtig Überlastung durch Rückgabetyp wählen erwartet:

//Num1 
@nonobjc func foo(guy name: String) -> String { 
    return "Hi \(name)" 
} 

//Num2 
@nonobjc func foo(guy name: String) { 
    print("Hi \(name)") 
} 

alle anderen Punkte, mit Ausnahme dieser Marke, mir richtig scheint