我想检查一个变量是否是数组类型(可能是[Int]
,[UIView]
或[AnyObject]
),而不仅仅是像[Int]
答案 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"
如果ok
是true
,则v
是某种数组。
答案 2 :(得分:0)
如果导入Foundation
func isArray(value: AnyObject) -> Bool {
return value is [AnyObject]
}
但是,如果您不导入Foundation
,则会出现错误,因为“[AnyObject]不符合协议AnyObject”。
导入Foundation
时,此快速编译器的原因会有所不同。只有类符合AnyObject
。 Any
协议适用于所有内容(类,结构,枚举等)。因此,在不导入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