38

我正在尝试使用 NSUserDefaults 保存一个数组,然后加载该数组,但我收到错误“无法推断泛型参数的参数”。有什么我做错了吗?似乎没有人很快遇到这个问题,所以我找不到任何解决方案。

IBAction func loadData(sender: AnyObject) {
    if let testCompositeArray = defaults.objectForKey("testScoreSATArray") as? Array {        
        self.showDataLabel.text = defaults.objectForKey("testScoreSATArray") as Array
    }
}
4

1 回答 1

69

您收到原始错误的原因是在 Swift 中,Array它是一个包含特定类型值的通用容器。所以你可以有一个Array<Int>保存整数的,或者一个Array<String>保存字符串的。但是你不能只有一个Array. 数组包含的东西的类型是泛型参数,而 Swift 抱怨,因为它无法弄清楚该类型应该是什么。有时它可以从它周围的代码上下文中推断出该类型,但并非总是如此,就像在这种情况下一样。

您可以通过给出要存储的东西的类型来解决问题:

IBAction func loadData(sender: AnyObject) {
    if let testCompositeArray = defaults.objectForKey("testScoreSATArray") as? Array<Int> {

            self.showDataLabel.text = toString(testCompositeArray)
    }
}

代替写作Array<Int>,你可以写更短的形式,[Int]

如您所见,您也可以使用 解决问题NSArray。不像Array,NSArray不使用泛型,因为它起源于 Objective-C,它与 Swift 有不同的方法。相反,NSArray它只持有一种东西,一个AnyObject. 这是一个可以指向任何类的实例的引用。

NSArray但是,使用and有一个很大的缺点AnyObject,即每次使用它们包含的值时,您通常必须将值“转换”为真实的东西,例如整数或字符串。这可能会很痛苦,更糟糕的是,当您假设自己拥有一种事物而实际上拥有另一种事物时,有时会导致错误。Swift 通常鼓励您更具体地了解类型以避免此类错误。

于 2015-05-21T18:42:50.020 回答