2017-08-24 16 views
0

タプルのsynataxがswitch enumの場合として欠けています。私はエラーを取得しています二つの条件の場合にはタプルによる列挙型スイッチ

public protocol QueryType { 
    var predicate: NSPredicate? { get } 
    var sortDescriptors: [SortDescriptor] { get } 
} 

public enum Query: QueryType { 
     case id(Int) 
     case owner(String) 
     case isSent(Bool) 

     public var predicate: NSPredicate? { 

      switch self { 
      case .id(let value): 
       return NSPredicate(format: "id == %d", value) 
      case (.owner(let value1), .isSent(let value2)): 
       return NSPredicate(format: "owner == %@ AND isSent == %@", value1, NSNumber(booleanLiteral: value2) 
      } 
     } 

     public var sortDescriptors: [SortDescriptor] { 
      return [SortDescriptor(keyPath: "id")] 
     } 
    } 

"Tuple pattern cannot match values of the non-tuple type 'MyType.Query'"

はそれも可能ですか?その後、switchで事前に

case .ownerIsSent(let value1, let value2): 
return NSPredicate(format: "owner == %@ AND isSent == %@", value1, NSNumber(booleanLiteral: value2)) 

おかげとして、case ownerIsSent(String, Bool)の作成について

EDIT

何!

+0

あなたは 'self'を' switch'しています。これは 'Query'型で、'(Query、Query)のタプルではありません。 –

+0

@NicolasMiariよかった!だから私が必要としているのは、switch(self、self)? – noname

+0

私はどちらもうまくいくとは思わない。 'self'は可能なケースの一つにしかなりません。私はタプルが行く方法だとは思わない。おそらくデータ型を再考する必要があります –

答えて

2

例えば2つの関連する値を持つケースを追加することができました。私はものだけをリネームします:

case id(Int) 
case sentByOwner(String,Bool) 

クエリを私が推測する述語のファクトリとして使用したいとします。 ...あなたはこれを行うことができると思います。

+0

あるいは、彼はオプションセットを使って複数のケースを取り決めることができますか? –

+0

クエリの組み合わせ数が非常に限られている場合でも、任意の組み合わせは許可されませんが、うまくいくはずです。同意します –

2

これは不可能です。 の場合にのみ、1つのケースを同時に切り替えることができます。 (self, self)でも同じケースがオンになります。

溶液は、編集がうまくいく

case id(Int) 
case owner(String) 
case isSent(Bool) 
case ownerIsSent(String, Bool)