如何判断变量是否为数组

Rya*_*yan 8 arrays swift

我有一个接受Any的Swift函数,我希望它能够接受一个字符串数组,一个Ints数组,一个混合数组或一个数组数组等.它也可以只接受一个String或一个Int,等,不在数组中.

所以我有这个:

    private func parse(parameter: Any) {
        if parameter is Int {
            // Int
        } else if (parameter is Float) || (parameter is Double) {
            // Double
        } else if parameter is String {
            // String
        } else if parameter is Bool {
            // Bool
        } else if let array = parameter as? [Any] {
            // Should catch all Arrays
        } else {
            assert(false, "Unsupported type") // [String] ends up here
        }
    }
Run Code Online (Sandbox Code Playgroud)

但如果我打电话parse(["Strings"]),断言就会被提出来.我怎样才能捕获所有类型的数组?

编辑 - 对于我想要完成的事情存在一些困惑.我基本上需要根据类型返回一个String,所以Int - >""和String - >"",所以一个数组会使递归调用返回"..."

这篇文章被标记为重复,但另一个问题是关于Javascript,而不是Swift.

fin*_*all 10

我终于找到了这样做的方法,即NSArray用于铸造.

private func parse(x: Any) {
    if let o = x as? [Any] {
        println("[Any]")
    }
    if let o = x as? [AnyObject] {
        println("[AnyObject]")
    }
    if let o = x as? NSArray {
        println("NSArray")
    }
}

let a: [Any] = ["bar"]
let b: [AnyObject] = ["bar"]
let c = ["foo", 3.14]

parse(a) // ==> [Any]
parse(b) // ==> [AnyObject], and also NSArray
parse(c) // ==> NSArray
Run Code Online (Sandbox Code Playgroud)

它看起来是一个包含Any内部表示的值的数组NSArray.(但是它应该能够投射c[Any]......?我怀疑这是一个错误.)


Chr*_*ver 7

理解 Swift 中的类型和类型相关问题的关键是条条大路通向协议。

这个问题的挑战是检测任何类型的数组,而不仅仅是一种具体类型。OP的示例失败了,因为 [Any] 不是 [String] 的基类或通用模式,也就是说,(据我所知),在 Swift 中[T] 不是 T 上的协变。除此之外,您无法检查 SequenceType 或 CollectionType,因为它们具有关联的类型 (Generator.Element)。

因此,惯用的解决方案是使用标记协议来指示您想要匹配您的标准的类型。如下图所示,您可以通过创建一个空协议并将其与感兴趣的类型相关联来实现此目的。

import Foundation


protocol NestedType {}
extension Array: NestedType {}
extension Set: NestedType {}
extension Dictionary: NestedType {}
extension NSSet: NestedType {}

protocol AnyTypeOfArray {}
extension Array: AnyTypeOfArray {}
extension NSArray: AnyTypeOfArray {}

protocol AnyTypeOfDictionary {}
extension Dictionary: AnyTypeOfDictionary {}


func printType(v:Any) {
    if v is NestedType {
        print("Detected a nested type")
    }

    if v is AnyTypeOfArray {
        print("\t which is an array")
    }

    else if v is AnyTypeOfDictionary {
        print("\t which is a dictionary")
    }
}


printType([String:Int]())
printType([Int]())
printType(NSArray())
Run Code Online (Sandbox Code Playgroud)

其输出为:

Detected a nested type
     which is a dictionary
Detected a nested type
     which is an array
Detected a nested type
     which is an array
Run Code Online (Sandbox Code Playgroud)