在 NSUserDefault 中对通​​用对象进行类型转换

Typecasting generic object in NSUserDefault

我有一个数组作为对象存储在 NSUserDefaults 中。

var defaults = NSUserDefaults.standardUserDefaults()
var details = [1,2,3]
defaults.setObject(details, forKey: "testing_array")

// this is wrong
var percentArray : Array? = defaults.objectForKey("testing_array") as Array

如何检索并将其用作数组?如果我将它设置为 anyObject,我以后就不能将它用作数组。

而不是:

var percentArray : Array? = defaults.objectForKey("testing_array") as Array

写:

var percentArray : Array<Int>? = defaults.objectForKey("testing_array") as? Array<Int>

因为在转换为数组时,您还需要指定它的通用类型。

编辑:

基于马特的评论。您还可以使用:

var percentArray  = defaults.objectForKey("testing_array") as [Int]

objectForKey 的结果将可转换为 AnyObject 数组,又名 [AnyObject]?

您不能将其转换为数组,因为它是通用的,您只能转换为特定的 class。

正如 Midhun 指出的那样,在这种特定情况下,您实际上有一个 Int 数组,因此您可以使用更具体的 [Int]?

为了更加安全,使用 if let 构造来验证转换:

if let percentArray = defaults.objectForKey("testing_array") as? [Int] {
    println(percentArray)
}

如果您知道它是一个 Int 数组,只需向 Swift 解释它是一个 Int 数组(通过转换):

var percentArray = defaults.objectForKey("testing_array") as [Int]