

この電卓アプリをswift2で書き直しをしているんですが、  
[https://www.youtube.com/watch?v=DGt1yBxBw9k&index=5&list=WL](https://www.youtube.com/watch?v=DGt1yBxBw9k&index=5&list=WL)

[code]

    class ViewController: UIViewController {
    
    var lastNumber: String = ""
    @IBOutlet var answerField: UILabel!
    @IBOutlet var operatorLabel: UILabel?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    @IBAction func buttonTapped(theButton: UIButton) {
        if answerField.text == "0" {
            answerField.text = theButton.titleLabel!.text!
            print(answerField!.text!)
        } else {
            answerField.text = (answerField.text)! + theButton.titleLabel!.text!
            print(answerField.text!)
        }
    }
    
    @IBAction func plusTapped(theButton: UIButton) {
        print("plus tapped")
        if operatorLabel?.text == "" {
            operatorLabel!.text = "+"
            answerField!.text = "0"
        } else {
            operatorLabel!.text = "+"
        }
    }
    
    @IBAction func minusTapped(theButton: UIButton) {
        print("minus tapped")
        if operatorLabel?.text == "" {
            operatorLabel!.text = "-"
            lastNumber = answerField.text!
            answerField!.text = "0"
        } else {
            operatorLabel!.text = "- "
        }
    }
    
    @IBAction func clearTapped(theButton: UIButton) {
        answerField.text = "0"
        operatorLabel!.text = ""
        lastNumber = ""
        print("clearButton Tapped")
    }
    
    @IBAction func enterTapped(_: AnyObject) {
    
        var num1: Int = Int(lastNumber)!
        var num2: Int = Int(answerField.text!)!
    
    if !num1 || !num2 {
    showError()
    return
    
    }
    func showError() {
        print("Error")
    }
    }
    
[/code]

[code]

    if !num1 || !num2 {
        showError()
        return
    
    }
    
[/code]

この部分でエラーが出ます。  
swift2ではどのように書き換えるんでしょうか？  
変数に中身があるか確認をするということはわかっているんですが。お願いします。


CC BY-SA 3.0
2016-02-06T16:44:26.390
21785
2016-02-07T03:05:17.713
2016-02-07T03:05:17.713
3639
14308
question
ios swift xcode swift2
swift2の整数型変数の中身を調べる方法で詰まった。。


リンク先にあるビデオはJun 8,
2014の表記がありますから、Swift1.0よりさらに前のbeta版時代のものですね。これからSwiftを学習される方が使われる限り、まだまだ多数の困難が予想されるので、早めに別のチュートリアルを探された方がいいでしょう。英語を苦にしないのであれば、電卓アプリをネタにして最新のSwiftに合わせて更新されているチュートリアルはいくつか見つかります。

ただし、「この部分でエラーが出ます。」と書かれているコード:

[code]

    if !num1 || !num2 {
        showError()
        return
    
    }
    
[/code]

は、その時のbeta版でも(あなたが書かれているようにnum1,
num2を`Int`で宣言していたのなら)エラーになったはずです。初期のbetaではOptional型ならそのような書き方ができたので、元のビデオではnum1,
num2がInt型ではなく`Optional<Int>`だったのかもしれません。  
で、正しいコードにしようとすると、その前の部分から直す必要があります。

[code]

    var num1: Int = Int(lastNumber)!
    var num2: Int = Int(answerField.text!)!
    
[/code]

この書き方ですと、lastNumberやanswerField.textの値が整数として解釈できないものだった場合に、アプリがクラッシュしてしまいます。(一般的にSwiftでの(否定を表す前置型以外の)`!`は、「間違っていたらクラッシュして知らせてください」と言う意味だと思っていてください。)

`Int(文字列)`型のイニシャライザはfailable(すいませんが、定訳を知りません)で、整数として解釈できない文字列が与えられた場合にnilを返すタイプのものです。そして、nilかどうかを判定すると同時にnilにならない変数を定義する構文として、Swiftには(beta版の時代から)if-
let構文(オプショナルバインディングと呼ばれます)がありますから、そちらを使うべきです。

`enterTapped`メソッド全体を書き直すと次のような感じになります。

[code]

    @IBAction func enterTapped(_: AnyObject) {
        if let
            num1 = Int(lastNumber),
            num2 = Int(answerField.text ?? "")
        {
            //num1, num2が整数値だったときにやりたい処理
        } else {
            showError()
            return
        }
    }
    
[/code]

UILabelのtextプロパティはnilになりうる(そしてそれがnilだったからといってアプリをクラッシュさせたくない)ので、`??`演算子を使ってデフォルト値を入れるように変えてあります。

古いコードをSwift2に書き換えようとすると、あまりお勧めできない(が、書き換えとしては簡単)ような書き方になってしまいがちです。そのような書き換えそのものの練習(それも古いbeta版から…)をしたいのでない限り、新しいチュートリアルにさっさと乗り換えた方がいいですよ。

追記(書き忘れ)  
showErrorがenterTappedの中にネストされていましたが、あまり意味もないので、普通にメソッドにしてしまう想定です。

[code]

    private func showError() {
        print("Error")
    }
    
[/code]

もう一つ書き忘れ  
Swift2ならguardを使うべきじゃないですか、って指摘されそうなコードになってしまってます。そちらはあなた自身でどう書けるかやってみて下さい。


CC BY-SA 3.0
2016-02-06T17:24:21.223
21786
2016-02-06T17:38:39.050
2016-02-06T17:38:39.050
13972
13972
21785
answer