如何检查变量是否是数组,而不是Swift中的特定类型数组?

时间:2014-12-05 04:57:16

标签: swift

我想检查一个变量是否是数组类型(可能是[Int][UIView][AnyObject]),而不仅仅是像[Int]

这样的特定类型

5 个答案:

答案 0 :(得分:2)

我不知道reflect是否比_stdlib_getDemangledTypeName更稳定或更不稳定,但它是另一种选择:

if reflect(myVariable).disposition == MirrorDisposition.IndexContainer {
    // myVariable is an array
} else {
    // myVariable is something else
}

答案 1 :(得分:1)

这是一个可能的测试(v是一个变量):

let ok = _stdlib_getDemangledTypeName(v) == "Swift.Array"

如果oktrue,则v是某种数组。

答案 2 :(得分:0)

如果导入Foundation

,以下代码有效
func isArray(value: AnyObject) -> Bool {
    return value is [AnyObject]
}

但是,如果您不导入Foundation,则会出现错误,因为“[AnyObject]不符合协议AnyObject”。

导入Foundation时,此快速编译器的原因会有所不同。只有类符合AnyObjectAny协议适用于所有内容(类,结构,枚举等)。因此,在不导入Foundation的情况下,Array类型是结构类型,并且它在swift中不符合AnyObject协议。当您导入Foundation时,swift编译器会隐式地将Array转换为NSArray,它会变为类,当然会符合AnyObject。这就是为什么当您导入Foundation以上代码时,否则不会。

答案 3 :(得分:0)

您可以使用NSObject方法“isKindOfClass()”来检查变量是否存储了要比较它的类的实例:

let isArray: Bool = myVariable.isKindOfClass(NSArray)

// OR

if myVariable.isKindOfClass(NSArray) {

   // whatever

}

或:

let isArray: Bool = myVariable is NSArray

// OR

if myVariable is NSArray {

   // whatever

}

“isKindOfClass()”仅适用于作为NSObject子类的类 “is”适用于Swift中的任何类

答案 4 :(得分:0)

这与checking if an Any.Type is an optional类似。

从Swift 2开始,语言缺少covariance and contravariance。此外,对无类型 Arrays(或任何无类型通用)的检查仍然不受支持。

Any.Type - 是 - Optional 案例Array一样,可以扩展为实现可以检查的协议无类型数组:

protocol ArrayProtocol{}

extension Array: ArrayProtocol {}

["one", "two"] is ArrayProtocol    // true
[12, true, "nay"] is ArrayProtocol // true
"not an array" is ArrayProtocol    // false