質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

2308閲覧

クラスの継承について質問です

triten

総合スコア7

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2016/02/16 07:27

Swift以前の、初歩的な質問ですみません。
MVCについて勉強しているのですが、クラスの継承で初っ端から躓いています。
ViewからModelの変数ageを変更するとmodel.ageに反映されますが、ViewController経由で変更すると反映されません。
何故でしょうか?

swift

1class Model{ 2 3 var age:Int = 0 4 5 func changeAge(){ 6 age++ 7 print(age) //age = 1 8 } 9 10} 11 12class ViewController{ 13 14 let model = Model() 15 16 func takeYears(){ 17 model.changeAge() 18 print(model.age) //age = 1 19 } 20} 21 22class View{ 23 24 let model = Model() 25 let viewController = ViewController() 26 27 @IBAction func changeAge(sender: AnyObject){ 28 29 viewController.takeYears() 30 print(model.age) //age = 0 31 3233 34}

ちなみに、もう一度ボタンを押すと、ModelとViewControllerのageは2,3と増えていきますが、Viewのmodel.ageは0のっまです。

宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

このコードでは、modelは、ViewControllerとViewのそれぞれに別々に2つ存在しています。
同じクラス(Model)を使って同じ変数名(model)で定義しても、それぞれは別の領域に別のものとして存在しています。

なので、ViewControllerのmodel.ageをカウントアップしても
Viewのmodel.ageは、それと別の領域に存在するものなので何も変わらず0のままです。

モデルは本来2つ存在させてはいけません。
なので、通常のモデルは、シングルトンオブジェクトとして生成したり、アプリの中にただ一つだけ存在するAppDelegateの中に保持したりして、各Viewからその1つのデータ管理場所(モデル)にアクセスできるようにします。

「継承」は、今回の話とは全く別の話ですので、それについては入門書のオブジェクト指向の説明をよく読んで勉強しなおすとよいと思います。

投稿2016/02/16 08:42

TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

triten

2016/02/16 10:49

そもそもModelのインスタンスが二つある事自体が、良くなかったのですね。 クラスのインスタンスは参照渡しなので、どこか一箇所で変更すれば、全てに波及するのだと思ってました。 Viewクラスを、print(viewController.model.age)としたところ、望む結果が得られました。 現在はオセロを作っています。 一つのクラスで一応の事は出来るようになったので、MVCに分けてみようと思ったのですが、悪戦苦闘中です。 ViewクラスでtouchesからCGPointを得て  →ViewContorollerクラスで整数X,Yに変換  →Modelクラスでboardのデータを変更  →Viewクラスで、boardの再描画・・・という感じです。 Viewクラスの描画用のデータを、let drawBoard = viewcontroller.mode.boardとしたところ、上手く行きました。
guest

0

ViewとViewControllerそれぞれの中で
let model = Model()
と宣言しているので、モデルが二つできています。

モデルをViewControllerの中でのみ宣言し、ViewからはViewControllerの中のモデルにアクセスするようにしてみてはどうでしょうか。

投稿2016/02/16 08:41

編集2016/02/16 08:42
AOKINAO

総合スコア268

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

triten

2016/02/16 10:55

有難う御座います。 ひとまず解決はしましたが、同時にわからない事も増えた感じです。 勉強し直します!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問