这应该很简单。我有一个数据源总是给我UInt16s。我从这些原始数据中导出不同的数据集并绘制结果。一些派生数据集是Floats,一些是UInt8,一些是UInt16。
我将派生数据排队,然后由我的图表类检索它。
队列是数组的数组,如下所示:[[UInt16]],[[Float]]或[[UInt8]]。
我正在尝试使用泛型,但是当我尝试将泛型类型的数组附加到声明为[[AnyObject]]的数组时,我遇到编译器错误。
当我正在学习Swift时,我不断碰到这个AnyObject /泛型问题。任何帮助/见解都表示赞赏。
class Base: NSObject {
var queue : [[AnyObject]] = Array()
func addtoQueue<T>(dataSet: [T]) {
queue.append(dataSet)
}
func removeFromQueue() -> [AnyObject]? {
return queue.removeAtIndex(0)
}
}
class DataSet1 : Base {
func getSomeData(rawData: [UInt16]) {
var result : [Float] = processRawData(rawData)
addToQueue(result)
}
}
答案 0 :(得分:2)
可能您不了解AnyObject是什么。它是所有类自动采用的协议类型。但是Float,UInt16和UInt8是不是类;它们是结构。
可能您的意思是[[Any]]
作为数组的类型。在这种情况下,您不需要通用。这有效:
var queue : [[Any]] = Array()
func addToQueue(dataSet:[Any]) {
queue.append(dataSet)
}
let f = Float(1)
let i1 = UInt8(2)
let i2 = UInt16(3)
addToQueue([f])
addToQueue([i1])
addToQueue([i2])
如果你坚持[[AnyObject]]
,你有两个问题:
你的通用版太通用了。并非宇宙中的所有东西都是AnyObject,那么编译器怎么知道这个东西 是一个AnyObject?像这样写下你的通用:
func addToQueue<T:AnyObject>(dataSet:[T]) {
queue.append(dataSet)
}
现在编译器知道在调用此方法时只会使用符合AnyObject的内容。然而,在那时,有点难以看出你的通用是什么;你没有在其他地方使用T,所以只需写一个正常的函数:
func addToQueue(dataSet:[AnyObject]) {
queue.append(dataSet)
}
第二个问题是你仍然需要转换(如Drew的答案告诉你的那样),因为在UIInt16和AnyObject之间没有自动桥接。 Float是_ObjectiveCBridgeable
,但UInt16和UInt8不是。
var queue : [[AnyObject]] = Array()
func addToQueue(dataSet:[AnyObject]) {
queue.append(dataSet)
}
let f = Float(1)
let i1 = UInt8(2)
let i2 = UInt16(3)
addToQueue([f])
addToQueue([NSNumber(unsignedChar: i1)])
addToQueue([NSNumber(unsignedShort: i2)])
答案 1 :(得分:1)
您需要做的是&#39;框&#39;提升潜在价值。你可以使用一个暴露了setter / getter和你可以切换的基础类型的枚举属性的协议来完成这个任务。上。或者,你可以看看你是否可以让NSNumber内置的Foundation为你工作。它正是这样做的:为你存储和检索任意数量的数字类型:
var queue : Array<NSNumber> = []
queue.append(NSNumber(int: 1))
queue.append(NSNumber(double: 2.5))
queue.append(NSNumber(float: 3.5))
var types : Array<String> = []
for item in queue{
println("number type: \(item)")
}