2017-11-13 15 views
1
struct PickerRange<T: Comparable> { 
    var start: T 
    var end: T 
    var step: T 

    var length: T { 
     // Binary operator '/' cannot be applied to two 'T' operands. 
     return max(start, end) - min(start,end)/step 
    } 
} 

計算されたプロパティを作成するときにエラーが発生します。直し方?2つの 'T'オペランドに2進演算子 '/'を適用できません

+3

このように考えると、「T」は*何でも同等です。 2つの弦をどうやって分けるのですか? – the4kman

+2

あなたの質問のテキストとしてコードを含めてください。 –

+0

@ the4kman: 'struct PickerRange ' - 同じエラーを指定した場合、 'T'は数字でなければなりません。 – ratkevich

答えて

2

Numericのいずれかのプロトコルを指定するだけです。浮動小数点精度について

struct PickerRange<T:FloatingPoint> { 
    var start: T 
    var end: T 
    var step: T 

    var length: T { 
     return max(start, end) - (min(start,end)/step) 
    } 
} 

SignedIntegerUnsignedIntegerまたは他のNumericプロトコルも選択肢です。

// Comparable

どちらもこれらのは、さらにComparableを指定するためにあなたを必要とするので、これらのいずれかを指定する場合には十分です。

EDIT:基本的に

How to make one structure for Int and Double?

、あなたはでき、SignedNumericを指定することで:

struct PickerRange<T:SignedNumeric & Comparable> { 
    var start: T 
    var end: T 
    var step: T 
} 

// Treated as PickerRange<Double> 
let a = PickerRange(start: 1.0, end: 5.0, step: 1) 

// Treated as PickerRange<Int> 
let b = PickerRange(start: 1, end: 5, step: 1) 

ただし、SignedNumericでサポートされていない/オペレータが含まれてlengthプロパティを、専門にしています。この問題を回避するには、構造体を初期化した型に型チェック/強制キャストが含まれます:

struct PickerRange<T:SignedNumeric & Comparable> { 
    var start: T 
    var end: T 
    var step: T 

    var length: T { 
     if T.self is Double.Type { 
      return (max(start, end) as! Double) - ((min(start, end) as! Double)/(step as! Double)) as! T 
     } else if T.self is Int.Type { 
      return (max(start, end) as! Int) - ((min(start, end) as! Int)/(step as! Int)) as! T 
     } else { 
      return 0 
     } 
    } 
} 

let a = PickerRange(start: 1.0, end: 5.0, step: 1) 
let b = PickerRange(start: 1, end: 10, step: 1) 

print(a.length) 
print(b.length) 
+0

IntとDoubleに1つの構造を作る方法は? 'Range = PickerRange (開始:1、終了:5、ステップ:1)' 'PickerRange '構造体を実行するとエラーが発生します:タイプ 'Int'がプロトコル 'FloatingPoint ' – ratkevich

+0

'/'は本質的に特定のタイプの2つのインスタンスに適用される関数なので、これは不可能です。 'SignedNumeric'プロトコルだけではその定義がなく、' FloatingPoint'または 'SignedInteger'は行いません。これには回避策があります。特定のタイプをチェックし、強制キャストを行い、必要な機能を呼び出す必要があります。私は私の答えを編集します。 – Hexfire

+0

完了。見てみな。 – Hexfire

関連する問題