2015-12-07 14 views
7

Sto usando Generics per aggiungere diversi tipi come Int, Double, Float, ecc. Ho usato il codice qui sotto ma ricevo l'errore "Operatore binario '+ 'non può essere applicato a due operandi' T '".L'operatore binario '+' non può essere applicato a due operandi 'T'

func add<T>(num1: T,num2: T) -> T { 
    return num1 + num2 
} 
+4

E la domanda è ...? –

+0

Cosa succede se il tipo non è un numero? Che cosa è successo selvaggio? – zaph

+0

Confronta http://stackoverflow.com/questions/25575513/what-protocol-show-be-adopted-by-a-type-for-a-generic-function-to-take-any-num –

risposta

16

Swift non sa che il tipo generico T ha un operatore '+'. Non puoi usare + su nessun tipo: ad es. su due controller di vista + non ha molto senso

È possibile utilizzare la conformità del protocollo per consentire a Swift di conoscere alcune cose sul proprio tipo!

ho avuto un andare in un parco giochi, e questo è probabilmente quello che stai cercando :)

protocol Addable { 
    func +(lhs: Self, rhs: Self) -> Self 
} 

func add<T: Addable>(num1: T, _ num2: T) -> T { 
    return num1 + num2 
} 

extension Int: Addable {} 
extension Double: Addable {} 
extension Float: Addable {} 

add(3, 0.2) 

Fatemi sapere se avete bisogno dei concetti dimostrato qui spiegati

+1

prova aggiungi (CGFloat (2.5), Float (2.0)) –

+0

@LeoDabus Swift non ha una definizione di + per CGFloat e Float. Per risolvere questo è possibile definire + per CGFloat e Float. In alternativa è possibile modificare leggermente la soluzione per trasmettere, per esempio, il primo tipo. –

+0

Adam Campbell per la spiegazione molto chiara. – user2749248

6

a Swift 4/Xcode 9+ puoi sfruttare lo Numeric protocol.

func add<T: Numeric>(num1: T, num2: T) -> T { 
    return num1 + num2 
} 

print(add(num1: 3.7, num2: 44.9)) // 48.6 
print(add(num1: 27, num2: 100)) // 127 

Utilizzando questo significa che non sarà necessario creare un protocollo speciale.

Ciò funzionerà solo nei casi in cui è necessaria la funzionalità fornita dal protocollo numerico. Potrebbe essere necessario fare qualcosa di simile alla risposta di @amam per% e altri operatori, oppure puoi sfruttare altri protocolli forniti da Apple nell'SDK Xcode 9.

+1

Ma con questa soluzione tutti i tipi devono essere uguali ... i tipi devono essere in grado di essere diversi cioè Int + Float – StackUnderflow

Problemi correlati