Swiftで遊ぼう! on Hatena

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

Swiftで遊ぼう! - 683 - Interface Builder, FaceView controller, Gestures, Multiple MVCs 3

2017年3月16日:Developing iOS 10 Apps with Swift - Free Course by Stanford on iTunes Uが公開されたため変更を加えます。ここの内容は「講義5 Gestures and Multiple MVCs」の内容に変更します。


さっそくMVCモデル構築に入ります。

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

FaceViewクラスはビュー(V)になるので表示のためのデータを保持するところではありません。FaceViewControllerもデータ保持の役割はないので、モデル(M)クラスが必要になります。ユーザーインターフェイスから切り離された「FacialExpression」を用意します。ポール先生は事前に用意されているファイルをドラッグ&ドロップしましたが、私はメニューから新規ファイルを作ります。

// Developing iOS 10 Apps with Swiftに対応
import Foundation

struct FacialExpression {
    
    enum Eyes: Int {
        case open
        case closed
        case squinting
    }
    
// iOS 9の内容をカット
//    enum EyeBrows: Int {
//        case Relaxed
//        case Normal
//        case Furrowed
//        
//        func moreRelaxedBrow() -> EyeBrows {
//            return EyeBrows(rawValue: rawValue - 1) ?? .Relaxed
//        }
//        
//        func moreForrowdBrow() -> EyeBrows {
//            return EyeBrows(rawValue: rawValue + 1) ?? .Furrowed
//        }
//    }
    
    enum Mouth: Int {
        case frown
        case smirk
        case neutral
        case grin
        case smile

// iO 9でメソッドを用意していました        
//        func sadderMouth() -> Mouth {
//            return Mouth(rawValue: rawValue - 1) ?? .Frown
//        }
//        
//        func happierMouth() -> Mouth {
//            return Mouth(rawValue: rawValue + 1) ?? .Smile
//        }
//    }
  
        var sadder: Mouth {
            return Mouth(rawValue: rawValue - 1 ) ?? .frown
        }
        
        var happier: Mouth {
            return Mouth(rawValue: rawValue + 1) ?? .smile
        }
    }
    
    var sadder: FacialExpression {
        return FacialExpression(eyes: self.eyes, 
                               mouth: self.mouth.sadder)
    }
    
    var happier: FacialExpression {
        return FacialExpression(eyes: self.eyes, 
                               mouth: self.mouth.happier)
    }
  
    var eyes: Eyes
// iOS 9は眉毛も操作していました
//    var eyeBrows: EyeBrows
    var mouth: Mouth
    
}

ここで腑に落ちない部分がありました。このモデルクラス、よく見るとStruct型(構造体)です。クラスじゃないんです。ポール先生は何も説明していないし、理由がよく分かりません。クラスで重要な概念であるプロトコールとデリゲーションをまだ説明していないので、継承のできない実値を扱うStruct型で説明をしているのかとおぼろげに感じたぐらいです。プログラマーの皆さん、どでしょうか?

普通はクラス宣言をすべきですよね。ここで説明のポイントはあくまでも、MVCの役割分担になっています。Modelは眉毛の位置や口のカーブの状態なんてどうでもいいことです。表情の情報だけ持っています。一方Viewは表情が笑っているとか悲しいという情報は入りません。この両者の間を取り持つのがControllerなんです。ということでFaceViewControllerに実装を始めます。

ちなみに、enumもメソッドを保持することができて、「rawValue」を持つことができます。私は説明無しで理解できたので分からない人は「The Swift Programming Language本」を読むといいでしょう。ポール先生も本を読んで勉強しろと仰ってます。

今日はここまで。