当我想在泛型T上使用两个协议时,似乎SWIFT中存在一个错误。
以下代码完美地工作。
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
}
}
这个版本产生错误T does not have a member named doubleValue
符合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
}
}
你为什么要使用可比性?为什么不把整数转换为双精度? –
这应该回答你的问题的一个主要部分:[什么协议应该采用的泛型函数采取任何数字类型作为参数在Swift?](http://stackoverflow.com/questions/25575513/what -protocol-应待采用逐a型换一个泛型函数到取任何-NUM)。如果您希望所有可能的类型都可以转换为Double,则必须扩展协议。 –
'Comparable'我需要其他功能,为了简化示例,我在此排除了这些功能。 – Morpheus78