swift nsuserdefaults loaddata

swift - argumento para el parámetro genérico no podría ser inferido



nsuserdefaults loaddata (1)

La razón por la que recibió su error original es que en Swift, Array es un contenedor genérico que contiene valores de un tipo específico. Entonces puede tener un Array<Int> que contenga enteros, o un Array<String> que contenga cadenas. Pero no puedes tener solo una Array . El tipo de cosa que contiene la matriz es el parámetro genérico, y Swift se queja porque no puede determinar cuál debería ser ese tipo. A veces puede inferir ese tipo del contexto del código que lo rodea, pero no siempre, como en este caso.

Puede resolver el problema dando el tipo de la cosa que está almacenando:

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

En lugar de escribir Array<Int> , puede escribir la forma más corta, [Int]

También puedes resolver el problema usando NSArray , como has encontrado. A diferencia de Array , NSArray no usa genéricos, ya que se origina en Objective-C, que tiene un enfoque diferente de Swift. En cambio, NSArray contiene solo un tipo de cosa, un AnyObject . Esta es una referencia que puede apuntar a instancias de cualquier clase.

Sin embargo, hay un gran inconveniente al usar NSArray y AnyObject , que es que cada vez que utilizas un valor que contienen, a menudo tienes que "convertir" el valor en algo real, como un entero o una cadena. Esto puede ser doloroso y, lo que es peor, a veces puede causar errores cuando supone que tiene un tipo de cosa cuando en realidad tiene otra. Swift generalmente lo alienta a ser más específico acerca de los tipos para evitar errores como este.

Estoy intentando guardar una matriz con NSUserDefaults y luego cargar la matriz, pero obtengo el error "El argumento para el parámetro genérico no se pudo inferir". ¿Hay algo que estoy haciendo mal? Nadie parece tener este problema a la ligera, así que no puedo encontrar ninguna solución.

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