Swift 2 - 检查空数组的类型(内省)

Swift 2 - Check Type of empty Array (Introspection)

我目前正在 Swift 2 中进行内省,在获取数组的特定类型时遇到问题(在本例中为 Array<String>)。

var prop = obj.valueForKey("strings")!

if prop is Array<String> {
println("true")
}
if prop is Array<Int> {
println("true")
}

输出为:

true
true

应该是

true
false

有没有办法找出数组成员的类型? 例如,如果我将数组声明为 Array<String> 我想获取字符串或者至少能够检查它是否是。 MirrorType 目前也没有取得任何成功。

也许您想要的是数组中每个单独项目的类型,而不是数组本身的类型?如果您在 Swift 中使用集合类型,则存储在数组(或字典)中的所有项目都是同一类型(除非您将数组声明为数组,例如违反规则......这不是通常是必要的,或者想要的)。

通过声明一个带有初始值的数组,您会自动告诉编译器它们是什么类型。如果你这样做:

let obj = [1,2,3]
var property = obj[0]

if property is String {
    print("true")
}
if property is Int {
    print("true")
}

编译器会告诉你 属性 是 String 总是失败,实际上没有必要做那个测试(因为我们已经知道它总是会失败)。

另一方面,如果您正在使用 Objective-C API 和类型,则有时您可能需要测试类型,这是在 [=22] 中测试类型的一个很好的例子=] 包含不同类型项目的集合:

let userDefaults = NSUserDefaults.standardUserDefaults()
let lastRefreshDate: AnyObject? = userDefaults.objectForKey("LastRefreshDate")
if let date = lastRefreshDate as? NSDate {
print("\(date.timeIntervalSinceReferenceDate)")
}

希望对您有所帮助。

有两种方法可以达到你想要的效果:

  1. if prop.dynamicType == Array<Int>.self(或[Int].self)优于if prop.dynamicType == [Int]().dynamicType {,因为[Int]()创建了一个未使用的"array of integers".
  2. 实例
  3. 通常,当您检查数组是否为特定类型时,您打算使用它 以某种方式(因此,您可能会将数组转换为 [Int])。话虽如此,我建议使用 if let arrayOfInts = prop as? Array<Int> {。使用此构造,您将检查 类型兼容性并准备以特殊方式处理您的数组(使用强制转换的 arrayOfInts 引用)。

不管怎样,你决定怎么做。