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