Swiftで遊ぼう! on Hatena

あしたさぬきblogでやってた初心者オヤジのiOSプログラミング奮闘記がHatenaに来ました

Swiftで遊ぼう! - 671 - Applying MVC 3

講義2はSwiftの構文説明がてんこ盛りです。

Developing iOS 9 Apps with Swift - Free Course by Stanford on iTunes U

MVCのM(モデル)として用意したCalculatorBrain.swiftにはinternalなメソッドとプロパティを用意して、同じプロジェクト内の他のクラスからアクセスできるようにしています。まだ具体的なコーディングをしていません。

class CalculatorBrain {
    
    func setOperand(operand: Double) {}
    
    func performOpeation(symbol: String) {}
    
    var result: Double {
        get {
            return 0.0
        }
    }
}

次はこのクラスは当然C(コントローラー)としてのViewControllerで利用されます。performOperationメソッドをみます。

@IBAction private func performOperation(sender: UIButton) {
    userIsInTheMiddleOfTyping = false
    if let mathematicalSymbol = sender.currentTitle {
        if mathematicalSymbol == "π" {        // Modelの仕事
            displayValue = M_PI               // Modelの仕事
        } else if mathematicalSymbol == "√" { // Modelの仕事
            displayValue = sqrt(displayValue) // Moswlの仕事
        }
    }
}

「Modelの仕事」をCalculatorBrainに任せている部分です。まずプライベート・プロパティとしてCalculatorBrainクラスのプロパティを持たせます。

private var brain = CalculatorBrain()

この「brain」を使ってメソッドを書き換えます。

 @IBAction private func performOperation(sender: UIButton) {
    if userIsInTheMiddleOfTyping {
        brain.setOperand(displayValue)
        userIsInTheMiddleOfTyping = false
    }
    if let mathematicalSymbol = sender.currentTitle {
        brain.performOpeation(mathematicalSymbol)
    }
    displayValue = brain.result
}

かなりすっきりと読みやすくなりました。ここからメソッドの具体的な実装です。

ViewControllerから渡されるデータを保持して計算結果を保持する変数をCalculatorBrain.swiftに持たせます。

private var accumulator = 0.0

するとperformOperation()メソッド以外は簡単に実装できます。

class CalculatorBrain {
    
    func setOperand(operand: Double) {
        accumulator = operand
    }
    
    func performOpeation(symbol: String) {}
    
    var result: Double {
        get {
            return accumulator
        }
    }
}

計算の心臓部分はperformOperationメソッドです。symbolで条件決めをするために「switch-case」文の説明が入ります。これも基本構文ですね。

    func performOpeation(symbol: String) {
        switch symbol{
            case "π": accumulator = M_PI
            case "√": accumulator = sqrt(accumulator)
        default: break
        }
    }

このSwitch文の中にあるcase文とdefaultのインデントがおかしくなっていますが、コードを書いたときにXcodeは自動的にコードを見やすいようにインデントを調整する機能があります。しかし、いつもちゃんと働くわけではありません。

私は今までインデントを適当に調整していたのですが、ポール先生はインデントを修正する重要性を説明しました。自分のコーディングスタイルを持っても構わないのですが、今時のプログラマーはチームで働くことが多いのでインデントのルールやスタイルは、それぞれのチームで決まり事があるので従う必要があるということです。もし従わなければ首になるのを覚悟しないといけないでしょう。

そんなわけでXcodeでコーディングする場合、可読性を維持するためにデフォルトのインデント調整をする必要があります。どうするとデフォルトのインデント調整ができるのか?簡単です。「Cmd + A」でコードを全部選択してから「Ctrl + I」をタイプします。

// Xcodeのデフォルトインデントに並びました!
    func performOpeation(symbol: String) {
        switch symbol{
        case "π": accumulator = M_PI
        case "√": accumulator = sqrt(accumulator)
        default: break
        }
    }

このやり方は知らなかったので勉強になりました!*1

今日はここまで。

*1:Xcodeのショートカットページに加えます。