0

プログラミングは初めてで、iPhone 8 アプリを作成するために iTunes U でスタンフォード コースを受講し始めました。Xcode 7 と Swift 2 を使用して El Capitan にいる間、彼らは Xcode 6 と Swift 1 を使用しています。Xcode が検出して修正するのに役立つコードのいくつかの違いを見つけました ("println" はたとえば、現在は「印刷」しています)が、コードの特定の部分でつまずいています:

   var displayValue: Double {
    get {
        return NSNumberFormatter().numberFromString(display.text!)!.doubleValue
    }
    set {
        display.text = "\(newValue)"
        userIsInTheMiddleOfTypingANumber = false
    }
}

これがまさに先生が書いた通りであることを確認するために、私は何度も再確認しました. 彼は正しくビルドされ、正しく機能しましたが、私のビルドは正しくビルドされましたが、操作しようとするとこの致命的なエラーが表示されます。

エラーのスクリーンショット

私はインターネットを見回しており、このサイト (スタンフォード電卓アプリがクラッシュし続ける) を含むいくつかの同様の例を見つけましたが、提案されたすべてを試した後、何かがシステムで一意であるか、動作しているに違いないと結論付けました。この問題を抱えていた他の環境よりも新しい Xcode/Swift 環境で。問題を解決した解決策はなく、すべての解決策で独自のエラーが追加されました。

他の誰かの質問に答えて、誰かがこのコードを使用して、「nil」が「display」によって返された場合に代わりに「0」を提供することを保証することを提案しました:

return (NSNumberFormatter().numberFromString(display.text) as? Double) ?? 0

私はこれを試しましたが、エラーが増えるだけでした.Swift 2に関連しているようです. Swift 1で良かった??)。

4

2 に答える 2

1

答えが見つかったかどうかはわかりませんが、今朝同様の問題に遭遇したので、見つけたものを共有したいと思いました.

デバッグ中に、次のように操作の簡略化されたバージョンに 2 つのコンソール ログを入力しました。

 case "x": if operandStack.count >= 2 {
    print(" display before popping is: \(display.text!) ")
    displayValue = operandStack.removeLast() * operandStack.removeLast()
    print(" display after popping is: \(display.text!) ")
    enter()
    }

ポップ後の表示は「newValue」として出てきました。最初はそれが何を意味するのか理解できませんでしたが、私の問題はセッターであることに気付きました。newValue はオプションで、アンラップする必要があります。つまり、"(newValue)!" です。

PS私は返すことにしました:

return (display.text! as NSString).doubleValue

私の中でget

また、newValue はラップされていないため、display を nil に設定するとクラッシュすることに注意してください。

于 2016-09-10T17:19:20.447 に答える