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

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

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

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

Q&A

解決済

4回答

3040閲覧

APIを利用したMVC設計の書き方がわかりません

175atsu

総合スコア21

Swift

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

0グッド

1クリップ

投稿2019/08/18 11:14

簡単なAPIを使ったアプリをMVC設計を使って書きたいのですがどのように分解していいかあまりイメージがわきません。

自分なりに考えて分け方にアドバイスがもらいたいです。

Model

Model

1struct PostData: Codable { 2 var app_id:String 3 var request_id: String 4 var sentence: String 5 var output_type: String 6}

View

View

1@IBAction func changeButton(_ sender: Any) { 2 var berore = beforeText.text 3 }

Controller

Controller

1ar request = URLRequest(url: URL(string: "https://labs.goo.ne.jp/api/hiragana")!) 2request.httpMethod = "POST"

このような分け方で問題ないですか?

個人的にControllerの部分があまりわかりません。
アドバイスお願いします。

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

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

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

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

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

guest

回答4

0

MVCが絡む話なのか自分はちょっとわかりませんが、
今回のケースでは、APIに送る内容、受け取る内容がJSON形式のようですので、その兼ね合いでModelとおっしゃっているようなCodableな構造体を用意しているだけですよね
(=欲しい情報は「ひらがな」だけで、構造体そのものは一時的なもので捨てちゃっても構わないもの)。

このAPIを利用する側にしてみたら

func hiranaga(kanji: String) -> String { ... }

というような漢字→ひらがな変換関数があればいいわけですよね。

実際はHTTP処理は非同期なので(?)、

func hiragana(kanji: String, completionHander: (Error?, String) -> ())

みたいな宣言になると思うのですが。

自分だったら

swift

1class GooAPI { 2 static func hiragana(kanji: String, completionHander: (Error?, String) -> ()) { 3 // ここでhttp処理して完了したらcompletionHanderを呼び出す 4 } 5}

といったUtilityクラスっぽいもの(※Utiltiyクラスそのものには賛否ありますが今回は名前空間の代わりに使っています)を用意して、JSON化に必要なPostDataやReceiveData的な構造体はfileprivateか、クラス内のprivateな構造体にして隠蔽してしまうと思います(外部でも構造体が必要になったらpublicにすれば良いかなと)。

これのメリットは一度作ってしまえば、いろんなViewControllerから参照でき、他のプロジェクトでも流用しやすい点です。

※この辺はあくまで自分のやり方ですので、他の人がどうやっているかは知りません。

投稿2019/08/19 02:57

takabosoft

総合スコア8356

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

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

175atsu

2019/08/19 05:07

コメントありがとうございます。 MVCに関してはVCと混ぜて考えようと思いました。 ただ、現在アプリ作成をしている上でアンラップ関連がうまくかけなくて積んでいます。 アドバイスいただけたら幸いです。 https://teratail.com/questions/206908
guest

0

ベストアンサー

人によって色々分け方が違うと思うので、
一個人の意見として受け止めていただけると幸いです。

Modelですが、
APIレスポンスをModelにするのではなく、APIとの通信の処理をModelに定義するべきだと思います。

なので質問に書いていただいたControllerの処理もModelにしてしまったほうがいいんじゃないかなと思います。

本来ViewControllerの処理はそれぞれ分けるべきですが,
SwiftにはUIViewControllerというクラスがあるくらいViewControllerの結合が強いと思っているので、そこまで規模の大きくないアプリではViewControllerは無理に分けずViewControllerに両方をになってもらった方がシンプルにかけると思います。

個人的に参考になったサイト様を貼らせていただきます。他にもMVCで実装している方がコードを公開していると思うので色々見てみるといいと思います。

投稿2019/08/18 13:07

編集2019/08/19 03:14
hayabusabusash

総合スコア767

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

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

0

シンプルに「MVCにのっとるには」という観点で、処理がそれぞれM,V,Cのどこになるかという点ではhayabusabusashさんの回答を概ね支持します。ViewとControllerの処理をVireControllerに持たせるというのには反対します。UIViewにさせるべきことをUIViewControllerに任せるのは違うと思います。

また別の意見として捉えていただきたいですが、私はそもそもiOSアプリの開発にMVCを適用するのは困難だと考えています。
単に私の設計がショボいと言われればそれまでですが、私はどうしてもModel-Controller-View-ViewControllerみたいな構造になってしまいます。MVCに当てはめようとすると「この処理ってこのクラスの責任なんだっけ?」みたいな話が(私の脳内で)出てきてしまいます

ちょっと宗教的な話でもあるので、ふんわりした回答で恐縮ですが……

投稿2019/08/19 01:14

thyda.eiqau

総合スコア2982

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

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

0

ワタシ、ココが参考になったアルよ。

投稿2019/08/19 06:32

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問