Matriz de tuplas en Swift

Tengo una función:

func parseJSON3(inputData: NSData) -> NSArray { var tempDict: (id:Int, ccomments:Int, post_date:String, post_title:String, url:String) = (id: 0, ccomments: 0, post_date: "null", post_title: "null", url: "null") var resultArray: (id:Int, ccomments:Int, post_date:String, post_title:String, url:String)[] = [] var error: NSError? var jsonDictionary: NSDictionary = NSJSONSerialization.JSONObjectWithData(inputData, options: NSJSONReadingOptions.MutableContainers, error: &error) as NSDictionary var firstArray = jsonDictionary.objectForKey("locations") as NSArray for dict in firstArray { tempDict.id = dict.valueForKey("ID") as Int tempDict.ccomments = dict.valueForKey("ccomments") as Int tempDict.post_date = dict.valueForKey("post_date") as String tempDict.post_title = dict.valueForKey("post_title") as String tempDict.url = dict.valueForKey("url") as String resultArray.append(tempDict) } return resultArray } 

En línea

resultArray.append (tempDict)

Tengo un error:

Falta el argumento para el parámetro ‘ccomments’ en la llamada

¿Por qué? Ayuda por favor….

Me parece que resultArray.append() está tratando la tupla un poco como un parámetro variado e intentando expandir la tupla para que coincida con sus propios argumentos. Se está quejando sobre su segundo parámetro porque solo está esperando uno. No he visto este comportamiento para Array.append() documentado en ninguna parte, así que diría que es un error en Swift.

Usar el operador adjunto += no parece tener ese problema:

 resultArray += tempDict 

Así que esto es bastante salvaje, no estoy seguro si lo calificaría como un error o como un comportamiento no documentado, ¡pero definitivamente es algo que debería estar en el radar para una solución / aclaración!

La situación es que append está tratando su argumento tempDict (que esperaríamos que fuera el único argumento para un método Array que toma un único miembro y lo agrega a la colección) como el primer argumento en una firma donde busca 5 argumentos (!), uno para cada miembro del tipo Tuple que contiene el Array.

Consulte lo siguiente para conocer algún comportamiento interesante (incluida la asignación de una etiqueta al único miembro de un miembro ‘Tuple’ ??) ->

 var arrayOne: Array = [] arrayOne.append("hi") println(arrayOne[0]) // hi var arrayTwo: Array<(String)> = [] // where (String) is a single-member Tuple arrayTwo.append("hi") println(arrayTwo[0]) // hi println(arrayTwo[0].0) // hi -> using .0 subscript to access the first member of the Tuple // wanna see something crazy? remember arrayOne, that holds members of type String? println(arrayOne[0].0) // hi -> this Array does not hold Tuples, but it looks like we can still treat its members like "single-member Tuples"? var arrayThree: Array<(str: String)> = [] // members of the Array are single-member Tuples with the label 'str' for their member arrayThree.append(str: "hi") // now we can't use append without providing the label 'str', acting as what looks like an argument label? var byeString = "bye" var byeTuple = ("bye") arrayThree += byeString // += doesn't care about the label, and will take either a String or a single-member Tuple holding a String arrayThree += byeTuple println(arrayThree[0]) // hi println(arrayThree[0].0) // hi println(arrayThree[0].str) // hi -> accessing the single member of the Tuple by its label 

… así que en su caso, donde está viendo el error al append lo que quiere que haga es (usando las tags que utilizó para declarar la Tupla como algo que se parece a las tags de los argumentos):

 var resultArray: (id:Int, ccomments:Int, post_date:String, post_title:String, url:String)[] = [] ... resultArray.append(id: someIntValue, ccomments: someOtherIntValue, post_date: someStringValue, post_title: someOtherStringValue, url: someAnotherStringValue) 

… y por supuesto, como se discutió, puedes evitar hacer eso simplemente usando += vez

¡Cosas locas! podría ser, por diseño, para cumplir algún propósito, podría ser una consecuencia de la herencia del protocolo que no estaba destinada a tener este efecto … ¡sería interesante saber la respuesta!

resultArray.append() parece tomar tempDict como el primer elemento de tupla ( id ).

Cambiándolo a:

resultArray += tempDict

parece comstackr y trabajar.

No estoy seguro de por qué append() no se comporta de la misma manera, ¡quizás puedas presentar un error!