我有一个功能:
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
}
排队
resultArray.append(tempDict)
我有一个错误:
在调用
中缺少参数'ccomments'的参数为什么呢?请帮助....
答案 0 :(得分:10)
在我看来,resultArray.append()
正在将元组视为一个变量参数,并尝试扩展元组以匹配其自己的参数。它抱怨你的第二个参数,因为它只是期待一个。我没有看到Array.append()
记录在任何地方的这种行为,所以我想说它是Swift中的一个错误。
使用附加运算符+=
似乎没有这个问题:
resultArray += tempDict
答案 1 :(得分:8)
所以这是非常疯狂的 - 不确定我是否会将其视为一个错误或无证件行为,但它肯定是应该在雷达上进行修复/澄清的事情!
情况是append
正在处理你的参数tempDict
(我们期望它是一个Array方法的唯一参数,它接受一个成员并将其添加到集合中)作为<签名中的第一个参数,它正在寻找5个参数(!),一个用于数组所拥有的元组类型的每个成员。
请参阅以下内容,了解一些有趣的行为(包括为1人'元组'的单个成员分配标签? - &gt;
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
...所以在你的情况下,你看到append
的错误它想要你做的是(使用你用来将元组声明为参数标签的标签):< / p>
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)
...当然,正如所讨论的那样,您可以通过仅使用+=
代替
疯狂的东西!可能是设计用于某种目的,可能是协议继承的结果,并不意味着产生这种效果......知道答案会很有趣!
答案 2 :(得分:0)
resultArray.append()
似乎将tempDict
作为第一个元组元素(id
)。
将其更改为:
resultArray += tempDict
似乎可以编译和工作。
我不确定为什么append()
的行为方式不一样,也许你可以提交错误!