将值转换为未知`Element`类型

时间:2016-01-19 19:17:48

标签: arrays swift generics

假设一个函数可以在任何Array上运行:

func g<T>(array: [T]) -> Void {
  // ...
}

...以及一个接收Any类型值的函数:

func f(x: Any) -> Void {
  if x is Array {
    // g(?)
  }
}

如何获得x的正确类型版本,我可以传递给g

请注意,g不依赖(明确)类型T。它所需要的只是迭代元素的能力,可以将其视为类型Any的值。因此,任何重写g以删除类型参数的解决方案都是可以接受的。

编辑:为了让事情变得更难,我希望这可以在Linux上工作,在你调用NSArray之前,Swift数组不是.bridge() s它们。

2 个答案:

答案 0 :(得分:1)

警告请注意,以下结果基于我在Mirror上的实验,并适用于Swift 2.1.1(Xcode 7.1.1)。未来的Swift版本可能会改变Mirror行为。

如果动态发现该值是否是任何类型的数组,您可以通过Mirror结构使用Swift的反射支持:

func processArray(array: Any) -> Bool {
    let mirror = Mirror(reflecting: array)
    guard mirror.displayStyle == .Collection else {
        return false
    }

    print("array has \(mirror.children.count) elements")

    return true
}

func f(x: Any) {
    if processArray(x) {
        // i just found an array
    }
}

f([1, 2, 3, "4"]) // prints "array has 4 elements"

答案 1 :(得分:0)

如果你想保留通用,你可以这样做:

func g<T>(array: [T]) -> Void {

}

func f(x: Any) -> Void {
    if let array = x as? [Any] {
        g(array)
    }
}