arrays - 在 swift 中使用通用数组

标签 arrays swift generics

这应该很简单。我有一个总是为我提供 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/

相关文章:

java - 制作一个 Comparator 对象来对通用 List<?使用 Collections.sort() 扩展 T>

javascript - 按数组内其他值分组的特定值的总和

arrays - 二分搜索与二分搜索树

objective-c - Touch ID for KeyChain 无 PIN 回退

string - 在应用程序及其扩展之间共享一个大字符串

c# - 如何在具有值类型约束的泛型声明类型之间进行复制

java - 制作三个轻度相关类的数组

php - 如何一次只获取一个键值对? PHP

Swift 如何加载 tableViewController 并将第 n 个单元格放在第一个位置但能够向上滚动?

java - 限制通用向上转型