Swift中的元组数组

14

我有一个函数:

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个回答

11

在我看来,resultArray.append() 将元组当作可变参数进行处理,并尝试将元组展开以匹配其自身的参数。它会因为只期望一个参数而抱怨你的第二个参数。我没有看到任何有关 Array.append() 的这种行为的记录,所以我认为这是 Swift 中的一个 bug。

使用附加运算符 += 似乎没有这个问题:

resultArray += tempDict

2
我不相信这描述的行为,查看我的答案以获取一些有趣的研究结果! - fqdn

9
这很奇怪 - 我不确定是否应该将其归类为错误或未记录的行为,但这绝对是需要修复/澄清的问题!在这种情况下,append 将您的参数 tempDict(我们希望它是单个成员并将其添加到集合中的数组方法的唯一参数)视为签名中的第一个参数,其中它正在寻找 5 个参数(!),每个参数都对应于数组持有的 Tuple 类型的每个成员。请参见以下内容以了解一些有趣的行为(包括将标签分配给一个 1 成员 'Tuple' 的单个成员??)。
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时出现错误,它想让您做的是(使用您用来声明元组的标签作为参数标签):

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)

...当然,如我们所讨论的,您可以通过只使用 += 来避免那样做。

疯狂的事情!可能是有意为之的设计,也可能是协议继承的后果,而这种后果并不是预期的…很有趣,想知道答案!


这真的很有趣(在Beta 3中仍在发生)。我猜这与func foo(x:Int,y:String)具有与func foo((x:Int,y:String))相同的效果有关。 - jtbandes

0

resultArray.append() 似乎将 tempDict 作为第一个元组元素(id)。

将其更改为:

resultArray += tempDict

似乎可以编译并工作。

我不确定为什么 append() 不会以相同的方式运行,也许您可以报告一个错误!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接