2014-06-06 8 views
6

Chcę użyć ** do przeciążenia funkcji wykładniczej. Pracuję, jeśli używam czegoś takiego jak "^", ale sposób pisania python jest ** i chciałbym użyć tego z szybkim. Jakikolwiek sposób to zrobić?Jak używać ** dla wykładników za pomocą @infix func **()?

błąd: realizacja Operator z deklaracji operatora z pasującym

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

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

Czy jesteś pewien, że '^' działa zgodnie z przeznaczeniem? Mam tylko to, aby działać jako dodatek: 'println (1^2) == 3' – vol7ron

+1

@ vol7ron'^'to Bitowy operator XOR. '1^2' jest po prostu przypadkowo równe' 1 + 2'. Zobacz [The Swift Programming Language] (https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language), Przewodnik po językach -> Operatorzy zaawansowani -> Operatory bitowe XOR. – Lensflare

+0

@ Lensflare: Mówiłem o Pythonie, gdzie '^' nie działa jako wykładnik. Myślę, że się myliłem i błędnie przeczytałem pytanie, które sugeruje, że mógłby przeciążyć '^' w Swift, aby działać jak karetka, ale chciał użyć '**', które nie działało, gdy próbowałem przeciążać. – vol7ron

Odpowiedz

26

Musisz zadeklarować operatora przed określeniem funkcji, jak następuje:

w Swift 2:

import Darwin 

infix operator ** {} 

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

println(8.0 ** 3.0) // works 

W Swift 3:

import Darwin 

infix operator ** 

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

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

Od wersji beta 6 musi być napisany 'operator infix ** {}'. – Klaas

+1

Dzięki @Klaas, zaktualizowałem odpowiedź dla Xcode 6 beta 6. –

+0

Swift3: '' operator infiksów ** '' <- nawiasy klamrowe nie są potrzebne – eonist

4

Aby upewnić się, że ** zostanie wykonane przed sąsiednim * lub /, lepiej ustawić pierwszeństwo.

infix operator ** { associativity left precedence 160 } 

Jak http://nshipster.com/swift-operators/ pokazuje, że operatorzy mają exponentiative 160 pierwszeństwo, jak < < i >> Operatorzy przesunięcia bitowego zrobić.

Powiązane problemy