2015-12-18 10 views
6

私はstruct Person extends OptionSetTypeを持っています。後でコードで、私は人のインスタンスが複数の値であるかどうかを確認するためにswitch文を使うことができますか? OptionSetTypeから複数のケースにマッチするスイッチ

あなたは

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? 

} 

どのように彼のためにテストするだろうありがとう==若くて強いですか?
彼をテストするには、若者と少年が含まれていますか?

答えて

5

OptionSetTypeは、サブタイプがSetAlgebraTypeなので、set algebraメソッドを使用して、オプションの組み合わせをテストすることができます。あなたが尋ねたいもの(そして問題のセットが何であるか)に応じて、それを行う方法は複数あるかもしれません。

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

:うまく機能テストの一種のためにそれを使用するために、今すぐ

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

まず、私は私が地元に一定にするために照会していた属性を入れますもちろん、これが具体的に求められるのは、himyoungBoyにリストされているすべてのオプションが含まれているかどうかです。それはあなたが気にするものかもしれないので、それはちょうどいいです。また、後でPersonに他のオプションを追加することも安全です。

しかしPersonは他の可能なオプションを持っていた、とあなたはhim正確youngBoyに記載されているオプション、および無他人が含まれていることを主張したい場合はどう? SetAlgebraTypeEquatableを拡張するので、あなただけの==でテストすることができます。

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

ところで、あなたはこのためにswitchステートメントを使用する必要はありません。スイッチは、いくつかの可能なケースの中から1つを選択するためのものです(AまたはBですか?)ので、コンビネーションをテストするために(A、B、A、Bのどちらですか?

+0

ライン「彼は== youngBoy場合は、」私はより多くのオプションが含まれるように私の質問を更新し、未解決識別子「youngBoy」のエラー使用を提供します。優れた説明をありがとう:) –

+1

'youngBoy'は私の投稿の最初のコードスニペットで宣言されています。 – rickster

0

単純なケース:

switch him { 
case [.boy, .young]: 
    // code 
default: 
    break 
} 
関連する問題