Swift中的元组数组

时间:2014-06-13 17:18:43

标签: nsarray tuples 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
}

排队

resultArray.append(tempDict)

我有一个错误:

在调用

中缺少参数'ccomments'的参数

为什么呢?请帮助....

3 个答案:

答案 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()的行为方式不一样,也许你可以提交错误!