假设一个函数可以在任何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它们。
答案 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)
}
}