38

NSUserDefaults で配列を保存してから配列を読み込もうとしていますが、「ジェネリック パラメーターの引数を推測できませんでした」というエラーが表示されます。私が間違っていることはありますか?誰もこの問題を迅速に抱えているようには見えないので、解決策が見つかりません。

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

1 に答える 1

69

元のエラーを受け取った理由は、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ます。とは異なりArrayNSArraySwift とは異なるアプローチを持つ Objective-C に由来するため、ジェネリックを使用しません。代わりに、NSArrayは 1 種類のみを保持しAnyObjectます。これは、任意のクラスのインスタンスを指すことができる参照です。

NSArrayただし、 andの使用には大きな欠点がありAnyObjectます。それは、それらに含まれる値を使用するたびに、値を整数や文字列などの実際のものに「キャスト」する必要があることです。これは苦痛であり、さらに悪いことに、実際には別の種類のものを持っているのに、ある種類のものを持っていると仮定すると、エラーが発生することがあります. Swift は通常、このようなエラーを回避するために型についてより具体的にすることをお勧めします。

于 2015-05-21T18:42:50.020 に答える