2015-05-28 51 views
2

这应该很简单。我有一个数据源,总是给我UInt16s。我从这些原始数据中推导出不同的数据集并绘制结果。一些衍生数据集是Floats,一些是UInt8s,一些是UInt16s。在swift中使用泛型数组

我将派生数据排列在稍后由图形类检索的位置。

队列是数组的数组,看起来像这样:[[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) 
    } 
} 

回答

1

你需要做的是'框'基础价值。你可以使用一个暴露了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)") 
} 
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) 
} 

的第二个问题是,你仍然将不得不转换(如德鲁的答案告诉你),因为没有AUTOMAGIC之间,比如桥接,一个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)]) 
+0

很好的解释 - 谢谢! – jay492355