我试图用NSUserDefaults保存一个数组,然后加载该数组,但出现错误"无法推断泛型参数的参数"我做错什么了吗?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.这是一个可以指向任何类实例的引用.

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

Swift相关问答推荐

它是RxSwift中直接用于可扩展视图的有效的可扩展BehaviorRelay值?

SWIFT`String.Encoding`:`.unicode`vs`.utf16`

如何在 Swift 中做类型安全的索引?

如何在 SceneKit 上制作毛玻璃效果

Pod lib lint 命令找不到 watchos 模拟器

为 SwiftUI 中的属性提供默认值

有什么方法可以快速为泛型参数分配默认值?

`IndexSet` 永远不会是空的?

我如何从 UIAlertController 导航到新屏幕(swiftUI)

我们如何显示关于 UITextField 是 xCode Swift 的建议?

获取 SwiftUI 中 Binding 的值更改更新

Vapor, fluent 使用 PostgreSQL 保存/创建复杂模型

Swift 协议只能设置?

为什么我可以转换为 NSManagedObject 但不能转换为我的实体类型?

为 UIImagePicker 设置委托返回错误

来自 ObservableObject 的绑定值

Swift UITableView reloadData 在一个闭包中

Switch 语句中的字符串:String不符合协议IntervalType

tableView 部分标题消失 SWIFT

Swift 5 秒后关闭 UIAlertView