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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

Q&A

解決済

1回答

286閲覧

Swiftの書き方について教えていただきたい

yoppy0066

総合スコア293

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

0グッド

0クリップ

投稿2018/08/01 12:39

Swift4でAPIにリクエストしてレスポンスを使って何か処理をするようなことをしたいのですが、イマイチよくわからず下記のようなコードになってしまいます。
とても冗長な感じがするのですがうまいことやるサンプルを教えていただきたいです

func request(callback:((_ result: Dictionary<String,Any>?)->Void)?) { let response: Dictionary<String,Any> = [ "code":200, "result": [ "id": 1, "name": "user name" ] ] callback!(response) } self.request { (response) in guard let result = response else { return } guard let code = result["code"] as? Int else { return } if code == 200 { // result["result"] で何らかの処理 } }

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

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

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

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

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

fuzzball

2018/08/02 00:43

どの辺に冗長さを感じているのでしょうか?guardをまとめるとか?request()の中は実際は非同期なんですよね?
guest

回答1

0

ベストアンサー

僕ならキャストが面倒くさいので

swift

1struct Response { 2 3 struct AAAResult { 4 5 let id: Int 6 let name: String 7 } 8 9 let code: Int 10 let result: AAAResult 11 12 init(id: Int, name: String, code: Int) { 13 14 self.code = code 15 self.result = AAAResult(id: id, name: name) 16 } 17}

を作って使いますね。(テキトーです)


swift

1func request(callback:((_ result: Dictionary<String,Any>?)->Void)?) {

これは

swift

1func request(callback: ((Dictionary<String, Any>?) -> Void)?) {

のように書くのが普通です。


swift

1 callback!(response)

にしてますけど、これはあり得ませんね。
引数((Dictionary<String,Any>?)->Void)?を非Optionalにするか

swift

1 callback?(response)

にすべきです。

引数のデフォルト値を {_ in }にしてしまう方法もあります。

swift

1func request(callback: (Dictionary<String, Any>?) -> Void = {_ in }) {

あとは、エラーが欲しくなると思うのでcallbackの引数をOptionalではなくいわゆるResult型にするかな?

swift

1enum Result<T> { 2 case value<T> 3 case error<Error> 4}

あるいは

swift

1enum Result<T, E: Error> { 2 case value<T> 3 case error<E> 4}

をモナドにした奴です。

「Swift Result」で検索すればいくつか見つかると思います。

2種類あるのは派閥です。どっちも使えるものなのでどちらを選ぶかは使用者の自由です。

エラーを使わないなら単に冗長さを増すだけなので僕はResultは導入はしません。

投稿2018/08/02 02:39

MasakiHori

総合スコア3384

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

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

yoppy0066

2018/08/02 04:49

丁寧にご回答頂きましてありがとうございます。 > callback!(response) がありえない理由 引数ではnil許可としてるのに、指定なしで呼び出すとクラッシュするからという意味になるでしょうか? > func request(callback: (Dictionary<String, Any>?) -> Void = {_ in }) { すみません、こちらの意味がよくわかりませんでした。。教えて頂けますと幸いです
MasakiHori

2018/08/02 04:59

上: はい 下: 何もしない関数(クロージャ)をデフォルト値とすることで、callbackが必要ないならrequest関数を引数なしで呼べばよいようになります
yoppy0066

2018/08/02 05:04

なるほど、ありがとうございます。 重ね重ね申し訳ございませんが、Responseはどのように使用するイメージになりますでしょうか?
MasakiHori

2018/08/02 05:35

あなたのrequest関数内で作ってる[String: Any]を struct にしただけです。 これを使えばcallbackの型が (Response?) -> Void になってcallback内でキャストを行わなくてよくなります。
yoppy0066

2018/08/02 05:38

ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問