2015-12-07 17 views
7

Genericsを使用してInt、Double、Floatなどのさまざまなタイプを追加しています。以下のコードを使用しましたが、 'は2つの' T 'オペランドには適用できません。2つの 'T'オペランドに2進演算子 '+'を適用することはできません

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

質問は...ですか? –

+0

タイプが数字でない場合はどうなりますか?何が起こったのか? – zaph

+0

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

答えて

16

Swiftは、ジェネリックタイプTに '+'演算子が含まれていることを知らない。どのようなタイプでも+は使用できません。 2つのビューコントローラーで+あまり意味がありません

プロトコルの適合性を使用して、あなたのタイプについていくつかのことを迅速に知ることができます!

私が遊び場に行くを持っていたし、これはあなたが:)

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) 

探しているものはおそらくあるあなたが実証された概念のいずれかが必要な場合は、私に教えてください、ここで/スウィフト4で

+1

try(CGFloat (2.5)、Float(2.0)) –

+0

@LeoDabus Swiftには、CGFloatとFloatの+の定義がありません。これを解決するには、CGFloatとFloatに対して+を定義することができます。あるいは、ソリューションをわずかに変更して、最初のタイプのキャストにすることもできます。 –

+0

tnxアダムキャンベル非常に明確な説明です。 – user2749248

6

を説明しましたXcode 9以降では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 

これは、特別なプロトコルを自分で作成する必要がないことを意味します。

これは、数値プロトコルによって提供される機能が必要な場合にのみ機能します。 %やその他の演算子については@ adamの答えと似たような処理が必要な場合や、Xcode 9 SDKでAppleが提供する他のプロトコルを利用することができます。

+1

しかし、このソリューションでは、すべてのタイプが同じでなければなりません...タイプは異なっている可能性があります – StackUnderflow

関連する問題