2015-12-07 11 views
7

Ich verwende Generics, um verschiedene Typen wie Int, Double, Float usw. hinzuzufügen. Ich habe den folgenden Code verwendet, aber ich erhalte den Fehler "Binärer Operator' + 'kann nicht auf zwei' T 'Operanden angewendet werden.Binärer Operator '+' kann nicht auf zwei 'T'-Operanden angewendet werden

+4

Und die Frage ist ...? –

+0

Was ist, wenn der Typ keine Nummer ist? Was passiert wild? – zaph

+0

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

Antwort

16

Swift weiß nicht, dass der generische Typ T einen '+' Operator hat. Sie können + nicht für einen beliebigen Typ verwenden: z. auf zwei Ansicht Controller + macht nicht zu viel Sinn

Sie können Protokollkonformität verwenden, um schnell etwas über Ihren Typ wissen zu lassen!

hatte ich einen Sprung auf einem Spielplatz und das ist wahrscheinlich das, was Sie für :)

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) 

Lassen Sie mich wissen suchen, wenn Sie eines der Konzepte müssen hier

demonstriert erklärt
+1

versuchen hinzufügen (CGFloat (2.5), Float (2.0)) –

+0

@LeoDabus Swift hat keine Definition von + für CGFloat und Float. Um dies zu lösen, können Sie + für CGFloat und Float definieren. Alternativ können Sie die Lösung leicht ändern, um zu sagen, der erste Typ. –

+0

tnx Adam Campbell für die sehr geklärte Erklärung. – user2749248

6

In Swift 4/Xcode 9+ können Sie die Numeric protocol nutzen.

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 

Damit können Sie kein spezielles Protokoll selbst erstellen.

Dies funktioniert nur in den Fällen, in denen Sie die Funktionalität des Numeric-Protokolls benötigen. Möglicherweise müssen Sie etwas Ähnliches wie @ adams Antwort für% und andere Operatoren tun, oder Sie können andere Protokolle nutzen, die von Apple im Xcode 9 SDK bereitgestellt werden.

+1

Aber mit dieser Lösung müssen alle Typen gleich sein ... die Typen müssen unterschiedlich sein können, dh Int + Float – StackUnderflow

Verwandte Themen