2016-06-19 5 views
0

Doubleをアンラップしているときにコードがクラッシュしています(display.text!)! 私はもし条件を置くが、それはここにそれが正常に動作しているが、私はプロパティとしてそれを作るしようとすると、それはそれは一般的ではありませんがアンラッピングしている間に予期せぬ不一致が見つかりました

var DisplayValue : Double 
{ 
    get 
    { 
     return Double(display.text!)! // thread 1 
     } 

    set 
    { 
     display.text = String(newValue) 
    } 
} 
+0

'display.text'が' 'abcdef" 'の場合はどうなりますか? – luk2302

+0

'text'は' nil'であるか、文字列は 'Double'で表現できません。それを確認します。 – vadian

+0

クラッシュを避けるために、* nilコアレス演算子* '??'を強制アンラップ '!'の代わりに使うとよいでしょう。 'Double(display.text ??" ")?? 0 'となる。 – vacawama

答えて

1

が動作していないまで

@IBAction private func buttonpress(sender: UIButton) 
{ 
    let digit = sender.currentTitle! 
    if userisinthemiddle 
    { 
     let currenttext = display.text! 
     display.text = currenttext + digit 
    } 
    else 
    { 
     display.text = digit 
    } 
    userisinthemiddle = true 
} 

を動作しませんでしたあなたのプログラムが失敗した場合に実際にプログラムをクラッシュさせない限り、変数のアンラップを強制することをお勧めします(私の経験ではまれです)。この場合、問題を診断する能力が阻害されているようです。 (1)力のアンラッピングを避け、(2)予期しない値に反応するより良い位置にいるようにしてください。

@IBAction private func buttonPress(sender: UIButton) 
{ 
    guard let digit = sender.currentTitle else 
    { 
     assertionFailure("digit is nil.") 

     return 
    } 

    print("digit: \(digit)" 

    if userIsInTheMiddle 
    { 
     let currentText = display.text ?? "" // If display.text is nil, set currentText to an empty string 
     print("currentText: \(currentText)" 

     display.text = currentText + digit 
    } 
    else 
    { 
     display.text = digit 
    } 

    print("display.text: \(display.text)" 

    userIsInTheMiddle = true 
} 

var displayValue: Double 
{ 
    get 
    { 
     let text = display.text ?? "" 

     guard let double = Double(text) else 
     { 
      // You probably want to replace this `assertionFailure` and return a default value like 0 

      assertionFailure("text could not be converted to a Double") 

      return 
     } 

     return double 
    } 

    set 
    { 
     display.text = String(newValue) 
    } 
} 

いくつかの質問:

  1. @IBActionに関連displayValue財産をどのように?
  2. +演算子を使用して、ここで2つの文字列を連結していますdisplay.text = currentText + digit。 2つの数字を追加しようとしていないことを確認するだけですか?
+0

答えと説明のためにたくさんありがとう 1. displayValueプロパティを1回作成して、文字列を倍精度浮動小数点数に変換する必要がなくなりました。 2. currenttextに "2"と数字が含まれていれば連結しようとしています"3"が含まれている場合、 "23" –

関連する問題