2016-05-09 9 views
1

私は迅速でONP変圧器を作るしようとしていますので、私は、オペレータ用のマップストリング]>のInt製のStringとして:使用 "+" をスウィフト

  • オプス[ "+"] = 1
  • オプス[ " - "] = 1
  • オプス[ "*"] = 2
  • オプス[ "/"] = 2

Unfortunetely、私はOPSを呼び出すしようとすると、[ "+"]私はゼロを得た。デバッガは、キーとして "+"と " - "の "データを読み取ることができません"と言います。 "*"と "/"はうまく動作します。 文字列として使用するために+ - の前に入力する特殊文字はありますか?

編集。

class ONP { 


    let equation:String? 
    var stack = [String]() 
    var knownOperators = [String:Int]() 

    init(equation: String?){ 
     self.equation = equation 
     initOperators() 
    } 

    func initOperators(){ 
     knownOperators["+"] = 1 
     knownOperators["−"] = 1 
     knownOperators["×"] = 2 
     knownOperators["/"] = 3 
    } 

    func transform() -> [String]? 
    { 
     var result = [String]() 
     if let sequence = splitEquation(){ 
      for op in sequence{ 
       if let operatorPriority = knownOperators[op] 
       { 
        while(!stack.isEmpty && (operatorPriority <= knownOperators[stack.last!])) 
        { 
         result.append(stack.removeLast()) 
        } 
        stack.append(op) 

       } 
       else { 
        result.append(op) 
       } 

      } 
      while !stack.isEmpty { 
       result.append(stack.removeLast()) 
      } 
      return result 
     } 
     return nil 
    } 

    private func splitEquation() -> [String]? 
    { 
     return equation?.characters.split(" ").map(String.init) 
    } 

} 
+2

あなたはコードを含めることができますので、私たちは、これが宣言されている正確にどのように見ることができますか?投稿を編集することができます。コードをコピー&ペーストして選択し、Ctrl + Kを押します。 – Arc676

+2

あなたの '+'は標準のASCIIプラスのようですが、あなたの ' - 'は期待される45の代わりに8722のユニコード値を持っています。 '-'のように複数の文字があるので、 – vacawama

+1

あなたは 'initOperators'を必要としません、演算子をバットの地図リテラルとして定義することができます。 – Alexander

答えて

1

私は遊び場にあなたのコードをコピーして呼ばれています:

let onp = ONP(equation: "3 + 4 * 2") 
onp.knownOperators["+"] // 1 
onp.knownOperators["−"] // 1 
onp.knownOperators["×"] // 2 
onp.knownOperators["/"] // 3 

あなたが見ることができるように、私は同じUnicode値で、まったく同じ文字あなたの使用していることを確認し、正しい値を取得します。

extension Character { 
    var unicodeScalarsValue: UInt32 { 
     return String(self).unicodeScalars.first!.value 
    } 
} 
Character("-").unicodeScalarsValue //normal minus = 45 
Character("−").unicodeScalarsValue //your minus = 8722 
+0

はい、私は異なった値を使っていました。しかし、私が 'print(onp.knownOperators)'を実行すると、私はデバッガで[link](http://imgur.com/23U4POm)を入手しました –

+0

@JarosławKrajewski '' '' ":2、" + ":1、 "/":3、 " - ":1] '。どのようにクラスに電話をかけ、オペレータを表示しますか? – Daniel

+0

この場合、私のプログラムは動作しますが、キーが "+"のときだけデバッガがデータを読み取ることができないと言っているのだろうかと疑問に思っています。 –

0

ソースコード内で特殊文字を使用する場合は十分注意してください。他の開発者はそれを認識していないかもしれません。たとえば、マルチサインは小文字のxのように見えます。数ヶ月後にあなたが使用した正確な文字を忘れるかもしれないので、コピー&ペーストのために多くの切り換えが必要です。

それは定数としてそれらを定義すると良いでしょう:

enum KnownOperator: String { 
    case Plus = "+"  // U+2B 
    case Minus = "−"  // U+2212 
    case Multiply = "×" // U+D7 
    case Divide = "/"  // U+2F 
} 

let knownOperators: [KnownOperator: Int] = [.Plus: 1, .Minus: 1, .Multiply: 2, .Divide: 2] 
関連する問題