web-dev-qa-db-fra.com

l'argument pour le paramètre générique n'a pas pu être déduit

J'essaie d'enregistrer un tableau avec NSUserDefaults, puis de charger le tableau, mais j'obtiens l'erreur "l'argument pour le paramètre générique n'a pas pu être déduit". Y a-t-il quelque chose que je fais mal? Personne ne semble avoir ce problème dans Swift, donc je ne trouve aucune solution.

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

La raison pour laquelle vous avez reçu votre erreur d'origine est que dans Swift, Array est un conteneur générique qui contient des valeurs d'un type spécifique. Vous pouvez donc avoir un Array<Int> qui contient des entiers, ou un Array<String> qui contient des chaînes. Mais vous ne pouvez pas avoir juste un Array. Le type de la chose que le tableau contient est le paramètre générique, et Swift se plaint car il ne peut pas comprendre ce que ce type devrait être. Parfois, il peut déduire ce type à partir du contexte de la code autour, mais pas toujours, comme dans ce cas.

Vous pouvez résoudre le problème en indiquant le type de chose que vous stockez:

IBAction func loadData(sender: AnyObject) {
    if let testCompositeArray = defaults.objectForKey("testScoreSATArray") as? Array<Int> {

            self.showDataLabel.text = toString(testCompositeArray)
    }
}

Au lieu d'écrire Array<Int>, vous pouvez écrire le formulaire plus court, [Int]

Vous pouvez également résoudre le problème en utilisant NSArray, comme vous l'avez constaté. Contrairement à Array, NSArray n'utilise pas de génériques, car il provient d'Objective-C qui a une approche différente de Swift. Au lieu de cela, NSArray ne contient qu'un seul type de chose, un AnyObject. Il s'agit d'une référence qui peut pointer vers des instances de n'importe quelle classe.

Cependant, il y a un gros inconvénient à utiliser NSArray et AnyObject, c'est-à-dire que chaque fois que vous utilisez une valeur qu'ils contiennent, vous devez souvent "convertir" la valeur en une chose réelle, comme un entier ou une chaîne. Cela peut être pénible, et pire encore, parfois provoquer des erreurs lorsque vous supposez que vous avez un type de chose alors qu'en réalité vous en avez un autre. Swift vous encourage généralement à être plus précis sur les types pour éviter des erreurs comme celle-ci.

65