Kann ich das mathematische Vorzeichen (+, -, *) irgendwie als Funktionsparameter senden? Ich möchte die Funktion reduce() für ein anderes Vorzeichen aufrufen.

12
Nikita Ermolenko 28 Dez. 2015 im 18:22

4 Antworten

Beste Antwort

In schnellen Vorzeichen sind Funktionsnamen für eine bestimmte mathematische Operation. Um das Vorzeichen als Parameter zu übergeben, muss der Parametertyp eine Funktion sein, die zwei Zahlen akzeptiert und eine Zahl zurückgibt. Wenn Sie einen Befehl drücken und auf ein Zeichen klicken, wird dessen Definition wie folgt angezeigt:

public func + (lhs: UInt8, rhs: UInt8) -> UInt8

public func + (lhs: Int8, rhs: Int8) -> Int8

public func + (lhs: UInt16, rhs: UInt16) -> UInt16

public func + (lhs: Int16, rhs: Int16) -> Int16

public func + (lhs: UInt32, rhs: UInt32) -> UInt32

public func + (lhs: Int32, rhs: Int32) -> Int32

public func + (lhs: UInt64, rhs: UInt64) -> UInt64

public func + (lhs: Int64, rhs: Int64) -> Int64

public func + (lhs: UInt, rhs: UInt) -> UInt

öffentliche Funktion + (lhs: Int, rhs: Int) -> Int

In Ihrem Fall sollte Ihre Reduzierungsfunktion wie folgt aussehen

func reduce(sign: (Int,Int)->Int) -> Int{

    return sign(2,3)
}

reduce(*)
reduce(-)
16
Zell B. 28 Dez. 2015 im 15:35
func doSomeCalculation(_ fun:((Int, Int) -> Int)) -> Int {
    return fun(12,13)
}

doSomeCalculation(+) // 25
doSomeCalculation(-) // -1

Das gleiche kann für UInt, IntXX usw. gemacht werden.

+ ist im Grunde einfach eine Funktion, die zwei Argumente akzeptiert und die Summe davon zurückgibt. Da es sich bei func um Objekte wie alle anderen handelt, können Sie sie als solche weitergeben.

Auf die gleiche Weise können Sie + an reduce übergeben.

8
luk2302 25 Jän. 2019 im 10:46

Ja, Sie können einen beliebigen binären Operator an die Funktion reduce() senden, sofern der ursprüngliche Wert und die Elemente in der Auflistung vom gleichen Typ sind und der Operator somit angewendet werden kann.

Stellen Sie sich Operatoren als Funktionen / Abschlüsse vor und Sie werden verstehen, warum dies in Swift möglich ist. Tatsächlich sind Operatoren genau wie Funktionen - sie werden als Verschlüsse bezeichnet.

Denken Sie auch darüber nach, wie neue Operatoren hinzugefügt werden können - Sie definieren eine Funktion mit dem Operatornamen, die eine Anzahl von Parametern akzeptiert, die der Operatorarität entsprechen.

Daher ist Folgendes syntaktisch korrekt und liefert die erwartete Ausgabe (6):

[1,2,3].reduce(0, combine: +)
5
Cristik 28 Dez. 2015 im 15:38

Als Charakter senden und dann wechseln, um Folgendes zu identifizieren:

func acceptASign(sign: Character) {
    switch sign {
    case "+":
        //do some addition
    case "-":
        //do some subtraction
    case "*":
        //do some multiplication
    case "/":
        //do some division
    default:
        break;
    }
}
-2
Tim 28 Dez. 2015 im 15:26