Swift Switch 访问 'case' 内的嵌套属性

标签 swift switch-statement pattern-matching

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

enter image description here

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
}

最佳答案

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

Swift 看到这一行:

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

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

也许你想要这样的东西:

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
}

关于Swift Switch 访问 'case' 内的嵌套属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56773666/

相关文章:

swift - 在 Swift 中使用 CoreGraphics 在屏幕上绘制像素

ios - 如何在容器 View 单元格中创建 map View

ios - 显示 Segue 后导航栏与我的内容重叠

ruby - 给定大量 URL,将 URL 分组为模式或正则表达式的最佳数据挖掘方法是什么?

scala - 返回类型密封时的主观性检查

perl - 如何在 Perl 中检查多个模式匹配

swift - Swift 中的阶段 1 和阶段 2 初始化

javascript - 让JS部分更简单

javascript - 从 JavaScript 数组中回显最高值

c# - 如何对依赖于控制台的 switch 语句进行单元测试