在swift中使用泛型数组

时间:2015-05-28 18:20:42

标签: arrays swift generics

这应该很简单。我有一个数据源总是给我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)
   }
}

2 个答案:

答案 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)")
}