Swift 2.0 Tuple模式元素标签必须为'_'

ald*_*ium 1 ios swift swift2

自从swift 2.0更新以来,我一直在努力修复我的所有代码.我有一个问题似乎是元组现在的工作方式:

public func generate() -> AnyGenerator <(String, JSON)> {
    switch self.type {
    case .Array:
        let array_ = object as! [AnyObject]
        var generate_ = array_.generate()
        var index_: Int = 0
        return anyGenerator{
            if let element_: AnyObject = generate_.next() {
                return ("\(index_++)", JSON(element_))
            } else {
                return nil
            }
        }
    case .Dictionary:
        let dictionary_ = object as! [String : AnyObject]
        var generate_ = dictionary_.generate()
        return anyGenerator{
            if let (key_: String, value_: AnyObject) = generate_.next() {
                return (key_, JSON(value_))
            } else {
                return nil
            }
        }
    default:
        return anyGenerator{
            return nil
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

特别是这条线:

if let (key_: String, value_: AnyObject) = generate_.next()
Run Code Online (Sandbox Code Playgroud)

抛出错误:元组模式元素标签'key'必须是'_'

我已经尝试做出改变,但我没有工作......

有任何想法吗?

rin*_*aro 5

问题是:我们不能再元组模式中使用类型注释.

发行说明中:

模式中不再允许使用类型注释,并将其视为异常声明的一部分.这意味着以前编写的代码如下:

var (a : Int, b : Float) = foo()
Run Code Online (Sandbox Code Playgroud)

需要写成:

var (a,b) : (Int, Float) = foo()
Run Code Online (Sandbox Code Playgroud)

如果需要显式类型注释.前一种语法与元组元素标签不明确.(20167393)

所以你可以:

if let (key_, value_): (String, AnyObject) = generate_.next() {
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,您可以省略: (String, AnyObject):

if let (key_, value_) = generate_.next() {
Run Code Online (Sandbox Code Playgroud)