无法推断出泛型参数的参数

时间:2015-05-21 18:21:01

标签: swift nsuserdefaults loaddata

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

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

1 个答案:

答案 0 :(得分:64)

您收到原始错误的原因是,在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。这是一个可以指向任何类的实例的引用。

然而,使用NSArrayAnyObject有一个很大的缺点,那就是每次使用它们包含的值时,你经常需要将值“转换”为真实的东西,比如整数或字符串。这可能是一种痛苦,更糟糕的是,当你认为自己有另一种东西时,有时可能会导致错误。 Swift通常鼓励您更加具体地了解类型以避免这样的错误。