gpt4 book ai didi

arrays - 在 swift 中使用泛型数组

转载 作者:可可西里 更新时间:2023-11-01 01:05:52 25 4
gpt4 key购买 nike

这应该很简单。我有一个总是给我 UInt16 的数据源。我从这些原始数据中导出不同的数据集并绘制结果。导出的数据集有的是Floats,有的是UInt8s,有的是UInt16s。

我将派生数据排队,稍后由我的绘图类检索。

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

最佳答案

可能你不明白什么是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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com