当前位置:  开发笔记 > 编程语言 > 正文

切换以匹配OptionSetType中的多个案例

如何解决《切换以匹配OptionSetType中的多个案例》经验,为你挑选了1个好方法。

我有一个结构Person扩展OptionSetType.稍后在代码中,如何使用switch语句检查Person的实例是否多于一个值?

谢谢

struct Person: OptionSetType {
let rawValue: Int
init(rawValue: Int){
    self.rawValue = rawValue
}

    static let boy         = Person(rawValue: 1 << 0)
    static let young       = Person(rawValue: 1 << 1)
    static let smart       = Person(rawValue: 1 << 2)
    static let strong      = Person(rawValue: 1 << 3)
}

//later declared
var him: Person!

//later initialised
him = [.boy, .young]

//now test using a switch block
Switch (him) {
   case .boy & .young   // <----- How do you get this to work?

}

如何测试他==年轻而强壮​​?
如何测试他包含年轻人和男孩?



1> rickster..:

OptionSetType是一个子类型SetAlgebraType,因此您可以使用set algebra方法来测试一个选项组合与另一个组合.根据您想要问的具体内容(以及所讨论的内容集),可能有多种方法可以实现.

首先,我将把我要查询的属性放在一个局部常量中:

let youngBoy: Person = [.Young, .Boy] 

现在,将其用于一种运行良好的测试:

if him.isSupersetOf(youngBoy) {
    // go to Toshi station, pick up power converters
}

当然,具体问的是是否him包含所列的所有选项youngBoy.这可能就是你所关心的,所以这很好.如果你以后扩展Person到其他选项也是安全的.

但是,如果Person有其他可能的选择,你希望断言him包含正好中列出的选项youngBoy,而不是其他?SetAlgebraType扩展Equatable,所以你可以测试==:

if him == youngBoy {
    // he'd better have those units on the south ridge repaired by midday
}

顺便说一下,你不想为此使用一个switch语句.Switch用于从几种可能的情况中选择一种(是A还是B?),所以使用它来测试组合(是A,B,A和B,还是两者都没有?)会使你的代码变得笨拙.

推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有