Swift 3,Xcode8β2。
我已经实现了一个对可比数据进行排序并尝试使用双打测试它的类。不幸的是,我收到错误"Cannot convert value of type '[Double]' to specified type '[T]'."
。我在下面的示例代码中重现了错误:
class foo<T: Comparable> {
let data: [T] = [Double]()
}
我是否正确假设双打是可比较的,如果是,我如何消除上述错误?
THX。
答案 0 :(得分:1)
此代码的问题
class Foo<T: Comparable> {
let data: [T] = [Double]()
}
是您将data
声明为泛型类型,必须为Comparable
。这意味着它可以包含T
类型的任何值。并且在使用类时定义了T
。
Foo<String>()
Foo<Double>()
Foo<Bool>()
看看上面的例子。在第一种情况下,T
是String
。有了这些信息,应该清楚这行不能编译
let data: [T] = [Double]()
因为它等同于写作
let data: [String] = [Double]()
这显然是错误的。
正如 @Eric D 已经建议的那样。
class Foo<T: Comparable> {
let data: [T] = []
}
现在,数据填充了正确类型的空数组。
所以在这种情况下
Foo<String>()
它是String
的数组。
在这种情况下
Foo<Double>()
它填充了一个Double
数组。
最后在这种情况下
Foo<Bool>()
,数组为Bool
。
答案 1 :(得分:0)
您的属性具有泛型类型T
:它不能被声明为持有具体类型。只需在声明中使用[T]
,并在实例化类时使用Double
。
对于我的例子,我还将属性设为var,以便我可以修改它:
class Foo<T: Comparable> {
var data: [T] = [T]()
}
let f = Foo<Double>()
f.data = [42.0, 33.0]
f.data.sort()
print(f.data)
给出
[33.0,42.0]
正如所料。