无法推断通用参数的参数

argument for generic parameter could not be inferred

我试图用 NSUserDefaults 保存一个数组,然后加载该数组,但我收到错误 "argument for generic parameter could not be inferred."我有什么地方做错了吗? swift 似乎没有人遇到这个问题,所以我找不到任何解决方案。

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

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

实例的引用

然而,使用 NSArrayAnyObject 有一个很大的缺点,那就是每次你使用它们包含的值时,你通常必须将值“转换”为真实的东西,如整数或字符串。这可能会很痛苦,更糟糕的是,当您假设您拥有一种东西而实际上您拥有另一种东西时,有时会导致错误。 Swift 通常鼓励您对类型进行更具体的说明,以避免出现此类错误。