2014-06-06 7 views
6

Desidero utilizzare ** per sovraccaricare una funzione esponenziale. Funziono se uso qualcosa come "^" ma il modo in cui pitone è ** e mi piacerebbe usarlo con swift. Come posso farlo?Come usare ** per esponenti usando @infix func **()?

errore: implementazione operatore con dichiarazione di operatore di corrispondenza fuori

@infix func ** (num: Double, power: Double) -> Double{ 
    return pow(num, power) 
} 

println(8.0**3.0) // Does not work 
+0

Sei sicuro che '^' funziona come previsto? Ho solo avuto modo di agire come un'aggiunta: 'println (1^2) == 3' – vol7ron

+1

@ vol7ron'^'è l'Operatore XOR bit a bit. '1^2' è uguale per coincidenza a' 1 + 2'. Vedere [The Swift Programming Language] (https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language), Guida linguistica -> Operatori avanzati -> Operatore XOR bit a bit. – Lensflare

+0

@Lensflare: stavo parlando di Python, dove '^' non funziona come esponente. Penso di aver sbagliato e di aver letto male la domanda, il che suggerisce che potrebbe sovraccaricare '^' in Swift per agire come un cursore, ma voleva usare '**', che non funzionava quando si cercava di sovraccaricare. – vol7ron

risposta

26

è necessario dichiarare l'operatore prima di definire la funzione, come segue:

In Swift 2:

import Darwin 

infix operator ** {} 

func ** (num: Double, power: Double) -> Double { 
    return pow(num, power) 
} 

println(8.0 ** 3.0) // works 

In Swift 3:

import Darwin 

infix operator ** 

func ** (num: Double, power: Double) -> Double { 
    return pow(num, power) 
} 

print(8.0 ** 3.0) // works 
+1

A partire dalla versione beta 6 deve essere scritto 'infix operator ** {}'. – Klaas

+1

Grazie a @Klaas, ho aggiornato la risposta per Xcode 6 beta 6. –

+0

Swift3: '' operatore infisso ** '' <- parentesi graffe non necessarie – eonist

4

Per assicurarsi che ** sia eseguito prima di neighbor * o /, è meglio impostare una precedenza.

infix operator ** { associativity left precedence 160 } 

Come http://nshipster.com/swift-operators/ spettacoli, gli operatori hanno exponentiative 160 la precedenza, come < < e >> operatori di spostamento bit a bit fanno.