2017-08-20 18 views
2
enum Operator: Character { 
    case Substract = "-" 
    case Add = "+" 
    case Multiply = "*" 
    case Divide = "/" 
} 

私は上記のenumを持っており、有効な演算子を持っているかどうかを調べる関数が宣言されています。例えばisOperatorは(「+」)列挙型が型に見つかりません

func isOperator(_ symbol: Character)-> Operator? {   
     let op = Operator(rawValue: symbol)  
     switch op { 
      case .Substract, .Add, .Multiply, .Divide: 
       return op 
      default: 
       return nil 
     } 
    } 

ここ返し何コンパイラ「列挙型ケースタイプでは見られない」されては私のswitch文(.Add ..など)で定義されている例を意味オペレータタイプでは使用できません。 。 のopはコンパイラが大文字小文字を区別できないのはなぜですか?

答えて

5

はい、let op = Operator(rawValue: symbol)optionalで、switchの場合は正確な値に一致しています。したがって、比較中にoptionalcaseに適用することができます。以下のようにします。

func isOperator(_ symbol: Character)-> Operator? { 
    let op = Operator(rawValue: symbol) 
    switch op { 
    case .Substract?, .Add?, .Multiply?, .Divide?: 
     return op 
    default: 
     return nil 
    } 
} 
4

あなたは、あなたが

でき
func isOperator(_ symbol: Character)-> Operator? { 
    return Operator(rawValue: symbol) 
} 

のみ4例を持っている。しかし、あなたが将来的にはより多くを持ってしようとしているならば、それはswitch

func isOperator(_ symbol: Character)-> Operator? { 
    guard let op = Operator(rawValue: symbol) else { 
     return nil 
    } 

    switch op { 
     case .Substract, .Add, .Multiply, .Divide: 
      return op 

     ... 

    } 
} 

guardを使用することをお勧めします
  • In迅速な、速い3の最新バージョン、enumの命名規則が変更されました。すべての列挙ケースは、camelCaseのルールに従っています。

  • あなたはisSomethingのような関数名を使用する場合、この関数は返す必要がありますBool

+0

おかげエイドリアンは、命名規則のために。複数のケースを追加してもpower(^)と言っても、最初のバージョンではオペレータがいて、opeator以外の値が渡されると、enumは初期化されず、nilを返します。だから私はここでガードの使用が表示されません。あなたは? – manismku

+0

@manismku私の最初のバージョンでは、 'init(rawValue:)'はオプションなので 'guarda'はありません。それが失敗すると、それはnilaを返します。 –

2

それは小文字で始まるあなたの例に名前を付けるスウィフト規則です:

enum Operator: Character { 
    case subtract = "-", add = "+", multiply = "*", divide = "/" 
} 

た場合は、関数がBoolを返すべき有効な演算子であるかどうかをチェックしたいとします。あなたは文字を拡張し、次のように読み取り専用の計算プロパティを作成することができます。

extension Character { 
    var isOperator: Bool { 
     return Operator(rawValue: self) != nil 
    } 
} 

テスト

Character("/").isOperator // true 

if let op = Operator(rawValue: "-") { 
    print(op) // "subtract\n" 
} 
+0

レオに感謝します。私は、戻り値として機能するenumを探しているので、私の例で名前を変更したかったと思います。ブール値だけが必要な場合のバージョンも正しいです。 – manismku

関連する問題