【问题标题】:Swift Switch access nested properties within 'case'Swift Switch 访问“case”中的嵌套属性
【发布时间】:2019-06-26 13:13:01
【问题描述】:

遵循此代码sn-p。我试图了解是否可以在 Switch 语句中访问对象的嵌套属性,而无需在“案例”本身内展开属性(避免不必要的闭包)。 这是一个愚蠢的简单示例。当然,编译器会失败(下图的代码 sn-p):

class Z {
    var common = 4
}

class A: Z {

}

class B: Z {

}

class C: Z {
    var specific: String? = "%"
}


let unknown = Z()

switch (unknown, unknown.common) {
case (let a as A, 4):
    break

case (let b as B, 4):
    break

case (let c as C, 4), let nonNilSpecific as? String:
    // use nonNilSpecific WITHOUT unwrap it within the case clousre
    break
default: break
}

【问题讨论】:

    标签: swift switch-statement pattern-matching


    【解决方案1】:

    当您在 switch 的单个案例中使用多个模式时,它们必须绑定所有相同的变量。

    Swift 看到这一行:

    case (let c as C, 4), let nonNilSpecific as? String:
    

    并认为您正在尝试匹配 (let c as C, 4)let nonNilSpecific as? String。这两个选项绑定了不同的变量,因此在案例主体中无法知道绑定了哪些变量。

    也许你想要这样的东西:

    switch (unknown, unknown.common) {
    case (let a as A, 4):
        break
    
    case (let b as B, 4):
        break
    
    case (let c as C, 4) where c.specific != nil:
        // force unwrap safe here, no closure needed
        let nonNilSpecific = c.specific!
    
    default: break
    }
    

    使用if

    let tuple = (unknown, unknown.common)
    if case (let a as A, 4) = tuple {
        // use a
    } else if case (let b as B, 4) = tuple {
        // use b
    } else if case (let c as C, 4) = tuple, let nonNilSpecific = c.specific {
        // use c and nonNilSpecific
    } else {
        // default case
    }
    

    【讨论】:

    • 感谢您的回复!确实有可能,但我正在尝试提出一个同步的解决方案,这意味着在单个班轮中我可以访问案例级别内的值。不过目前看来是不可能的,至少 Switch 不行……让我们等一下,说不定有人会想出一些黑魔法哈哈
    • 感谢@zombie 的编辑。现在我脑子里有Cranberries' song,在我的脑海里......
    • let case 似乎更干净,也让我免于声明“default” case!谢谢! :)
    • 嘿!我发布了另一个与 Swift-compile-issues 相关的问题。以防万一您感兴趣:stackoverflow.com/questions/56814387/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    • 2015-01-01
    相关资源
    最近更新 更多