泛型参数的参数推断失败

39
我试图使用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
    }
}
1个回答

70
您收到原始错误的原因是在 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 通常鼓励你更加具体地指定类型。


1
很棒的答案,帮助我掌握了泛型的概念...终于! - DogCoffee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接