It seems that there is a bug in SWIFT when I want to use two protocols on a generic type T.
The following code works perfectly.
protocol DoubleConvertible {
var doubleValue : Double { get }
}
protocol NumericType: Equatable, Comparable, DoubleConvertible {
func +(lhs: Self, rhs: Self) -> Self
func -(lhs: Self, rhs: Self) -> Self
func *(lhs: Self, rhs: Self) -> Self
func /(lhs: Self, rhs: Self) -> Self
func %(lhs: Self, rhs: Self) -> Self
init(_ v: Int)
init(_ v: Double)
}
extension Double : NumericType {
var doubleValue : Double { return self }
}
extension Int : NumericType {
var doubleValue : Double { return Double(self) }
}
class MathStatistics<T: NumericType> {
var numbers = [T]()
func average() -> Double? {
if numbers.count == 0 {
return nil
}
let sum = numbers.reduce(T(0)) { $0 + $1 }
return sum.doubleValue / numbers.count.doubleValue
}
}
This version produces the error T does not have a member named doubleValue
in line return sum.doubleValue / numbers.count.doubleValue
protocol NumericType: Equatable, Comparable {
func +(lhs: Self, rhs: Self) -> Self
func -(lhs: Self, rhs: Self) -> Self
func *(lhs: Self, rhs: Self) -> Self
func /(lhs: Self, rhs: Self) -> Self
func %(lhs: Self, rhs: Self) -> Self
init(_ v: Int)
init(_ v: Double)
}
protocol DoubleConvertible {
var doubleValue : Double { get }
}
extension Double : DoubleConvertible {
var doubleValue : Double { return self }
}
extension Int : DoubleConvertible {
var doubleValue : Double { return Double(self) }
}
class MathStatistics<T: NumericType, DoubleConvertible > {
var numbers = [T]()
func average() -> Double? {
if numbers.count == 0 {
return nil
}
let sum = numbers.reduce(T(0)) { $0 + $1 }
return sum.doubleValue / numbers.count.doubleValue // error T does not have a member named doubleValue
}
}