Swift中的元组数组

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)

  • 我不相信这描述了这种行为,请参阅我对我调查的一些有趣结果的答案! (2认同)

fqd*_*qdn 9

所以这是非常疯狂的 - 不确定我是否会将其视为一个错误或无证件行为,但它绝对应该在雷达上进行修复/澄清!

情况就是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)

......当然,正如所讨论的那样,你可以通过+=改为避免这样做

疯狂的事情!可能是设计用于某种目的,可能是协议继承的结果,并不意味着具有这种效果......知道答案会很有趣!