2017-07-18 1 views
0

switch-caseが期待どおりに機能していません。ただし、型の指定や比較は直接動作します。以下を参照してください:の比較のためのスイッチケースのスワイプ静的変数

class AnimalHelper { 
    func loadAnimal(_ animal: Animal) { 

     // Doesn't compile 
     switch animal { 
      case .squirrel, .deer: loadGrass() 
      case .dolphin: return // not implemented 
      default: loadMeat() 
     } 

     // Direct comparison works 
     if animal == .squirrel || animal == .deer { 
      loadGrass() 
     } else if animal == .dolphin { 
      return // not implemented 
     } else { 
      loadMeat() 
     } 

     // Specifying the type explicitly also works 
     switch animal { 
      case Animal.squirrel, Animal.deer: loadGrass() 
      case Animal.dolphin: return // not implemented 
      default: loadMeat() 
     } 
    } 

    func loadGrass() {} 
    func loadMeat() {} 
} 

class Animal { 
    let id = 6 // Will be generated 
    let hasFourLegs = true 
    let numberOfEyes = 2 
    // ... // 

    static var squirrel: Animal { return .init() } 
    static var dolphin: Animal { return .init() } 
    static var puma: Animal { return .init() } 
    static var deer: Animal { return .init() } 
} 

extension Animal: Equatable { 
    public static func ==(lhs: Animal, rhs: Animal) -> Bool { 
     return lhs.id == rhs.id 
    } 
} 

を私は、次のコンパイルエラーを取得していますので、そのうち上記について何かがかなり右ではないと確信している:

Enum case 'squirrel' not found in type 'Animal' 
Enum case 'deer' not found in type 'Animal' 
Enum case 'dolphin' not found in type 'Animal' 

私がチェックしているか教えてくださいswitch-caseの平等のための条件は、ifの条件とは異なる。スウィフトは

+2

正確なエラーメッセージで質問を更新し、エラーの原因となった行を指摘してください。 – rmaddy

答えて

3

switch-caseswitch - 値とcaseラベルと一致するように、いくつかの異なるルールを使用することもできます。この場合

に一致enum

  • ケースを、あなたはドット有鉛ケースのラベルを使用することができますお待ちください。Animalenumではありません。

    enum場合は値を関連している可能性があり、これは、平等以下と同じではない。)

  • パターンマッチングオペレータ~=

    スウィフトは、switch -valueのタイプの過負荷を検索case -labelのタイプは、見つかった場合、演算子を適用し、と一致する結果がであるとして、Boolの結果を使用します。 Swiftはの値とは関係なくcaseのラベルの種類を推測する必要があります。したがってSwiftはドットリード式のcaseラベルの種類を推論できません。

  • 平等==

    switch - 値がEquatableある場合、スウィフトは、case -labelsにswitch -valueを一致させるための等価演算子==を使用します。

(私は今を考えることはできませんこれ以上があるかもしれません。)

詳細な行動が明確に定義されますが、コンパイラは2つのルールを解決することは難しいされていません -と平等をマッチングパターン。 (あなたは~=Equatableのためのタイプでカスタム照合を定義することもできます。)

ので、スウィフト3で、case -labels中ドット有鉛表記のみenumタイプのために動作します。

しかし、私が確認した限り、スウィフト4はそれを作った。 Xcode 9を試してください(現在は最新のベータ3です)。あなたのコードはコンパイルされます。この動作は、Xcode 9のリリースバージョンで変更される可能性がありますが、回避する方法は分かっています。

関連する問題