这应该很简单。我有一个总是为我提供 UInt16 的数据源。我从这些原始数据中得出不同的数据集并绘制结果。导出的数据集有些是Float,有些是UInt8,有些是UInt16。
我将派生数据排队,稍后由我的图形类检索。
队列是数组的数组,看起来像这样:[[UInt16]]、[[Float]] 或 [[UInt8]]。
我正在尝试使用泛型,但当我尝试将泛型类型数组附加到声明为 [[AnyObject]] 的数组时,出现编译器错误。
当我学习 Swift 时,我经常遇到这个 AnyObject/generic 问题。任何帮助/见解表示赞赏。
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)
}
}
最佳答案
可能你不明白AnyObject是什么。它是所有类自动采用的协议(protocol)类型。但 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)])
关于arrays - 在 swift 中使用通用数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30514268/