web-dev-qa-db-ja.com

ジェネリックパラメーターの引数を推測できませんでした

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

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

元のエラーを受け取った理由は、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種類のみが保持されます。これは、任意のクラスのインスタンスを指すことができる参照です。

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

65