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
はジェネリックを使用しません。これは、Swiftへのアプローチが異なるObjective-Cに由来するためです。代わりに、NSArray
にはAnyObject
という1種類のみが保持されます。これは、任意のクラスのインスタンスを指すことができる参照です。
ただし、NSArray
とAnyObject
を使用することには大きな欠点があります。つまり、それらに含まれる値を使用するたびに、値を実際の値に「キャスト」する必要があります。整数または文字列。これは苦痛になる可能性があり、さらに悪いことに、実際には別のものがあるときにある種のものがあると仮定すると、エラーが発生することがあります。 Swiftは一般に、このようなエラーを回避するために、型についてより具体的になることをお勧めします。