Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

クラスのオプショナル型の扱いについて【iOSアプリ設計パターン入門 】

Discussion

Closed

はじめに

ページを開いていただきありがとうございます。この質問はiOSアプリ設計パターン入門が手元にある前提で質問しております。

現在置かれている状態

  • いくつかアプリを作ったが、Swift言語そのもの、特にメモリの扱いについての理解が浅い。
  • オプショナル型やクラス、インスタンスなどについてはわかる。
  • アーキテクチャの勉強をしている。

わからないこと

iOSアプリ設計パターン入門 第5章MVC のp.90,91 のサンプルアプリを実際に制作しています。Cocoa MVCのUIViewControllerクラス のファイルにおいて、

var myModel: Model? {
    didSet {
      //ViewとModelを結合し、Modelの監視を開始する
      registerModel()
    }
}

//省略

@objc func onMinusTapped() { myModel?.countDown() }

とかかれています。
このコードにおいていくつかわからないことがあります。

  • myModelはなぜModel?型なのか。Model型ではなぜいけないのか。
  • 全てのファイルを通して、myModelの値が変わっている処理が見当たらず、didSetが呼ばれるタイミングがわからない。
  • registerModel()viewDidLoad()などの中に入れないのはなぜか。

簡略化のため箇条書きで書かせていただきました。回答よろしくお願いいたします。🙇‍♂️

0
  • Modelが後からセットされるためです
  • サンプルコードのAppDelegateクラスを見てください
  • viewDidLoad()が呼ばれたときにModelがセットされているとは限らないからです
1Like

回答ありがとうございます。🙇‍♂️
二つ目の質問は確認不足でした。教えていただきありがとうございます。

一つ目の質問ですが、Modelを後からセットすることの必要性がわかりません。

var myModel: Model = Model {
    didSet {
      //ViewとModelを結合し、Modelの監視を開始する
      registerModel()
    }
}

としても同じ挙動になるのですが、これではなぜいけないのでしょうか。
よければ教えていただきたいです。

三つ目の質問についてですが、

registerModel()の中でmyModel を使うため、didSetを用いて安全に書いているという理解で正しいでしょうか。

0Like

一つ目について、後からというより外からですね(p.93)。Modelがいつ生成されるか、どう生成されるかをControllerは知る必要がないのでそうなっているのではないかと思いますが、正確なところはわかりません。ちなみに、示されたコードは同じ挙動になりません(registerModel()が呼ばれない)。

三つ目について、didSetを使うのはModelがセットされたタイミングで監視を開始するためです(p.89、これは原初MVCでの説明ですがCocoa MVCも同様です)。

0Like

返信ありがとうございます。
ControllerがModelやViewを生成する方法について、慣例などはあるのでしょうか?
lazy varでViewを生成したり、didSetでModelを生成するのはよくあるやり方なのでしょうか。

0Like

慣例というほどのものはないと思います。
lazy varで生成はよくありますが、didSetで生成はどういう実装を指しているのかがわかりません。

0Like

Your answer might help someone💌