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)
}
}
SignedInteger
、UnsignedInteger
または他の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)
このように考えると、「T」は*何でも同等です。 2つの弦をどうやって分けるのですか? – the4kman
あなたの質問のテキストとしてコードを含めてください。 –
@ the4kman: 'struct PickerRange' - 同じエラーを指定した場合、 'T'は数字でなければなりません。 –
ratkevich