Ale*_*mov 14 tuples nsarray swift ios8
我有一个功能:
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
}
Run Code Online (Sandbox Code Playgroud)
排队
resultArray.append(tempDict)
我有一个错误:
在调用中缺少参数'ccomments'的参数
为什么?请帮忙....
Nat*_*ook 11
在我看来,像resultArray.append()处理元组有点像变量参数,并试图扩展元组以匹配自己的参数.它抱怨你的第二个参数,因为它只是期待一个.我没有在Array.append()任何地方看到这种行为,所以我想说它是Swift中的一个错误.
使用附加运算符+=似乎没有这个问题:
resultArray += tempDict
Run Code Online (Sandbox Code Playgroud)
所以这是非常疯狂的 - 不确定我是否会将其视为一个错误或无证件行为,但它绝对应该在雷达上进行修复/澄清!
情况就是append将你的参数tempDict(我们希望它是一个Array方法的唯一参数,只需一个成员并将其添加到集合中)作为签名中的第一个参数,它寻找5个参数(! ),一个用于Array所拥有的元组类型的每个成员.
请参阅以下内容以了解一些有趣的行为(包括为1个成员的'元组'的单个成员分配标签??) - >
var arrayOne: Array<String> = []
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
Run Code Online (Sandbox Code Playgroud)
...所以在你的情况下,你看到append它想要你做的事情的错误是(使用你用来声明元组看起来像参数标签的标签):
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)
Run Code Online (Sandbox Code Playgroud)
......当然,正如所讨论的那样,你可以通过+=改为避免这样做
疯狂的事情!可能是设计用于某种目的,可能是协议继承的结果,并不意味着具有这种效果......知道答案会很有趣!