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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Swift

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

Q&A

解決済

1回答

1771閲覧

JSONでBool値を取得して画面遷移したい。

NyoroNyoroKo

総合スコア17

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Swift

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

0グッド

1クリップ

投稿2018/09/26 09:29

Xcode 9.4.1
Alamofire 4.7.3
を使っています。

やりたいことは、複数のゲーム選択画面から特定のゲームに移る際に、
そのゲームのセーブデータが残っているかをBoolで受け取り、
false(ない)なら新規ゲーム画面へ、true(ある)ならセーブデータの画面へ、
そもそもセッションでエラーが起きた時には前の画面へ戻る処理をしたいのです。

lang

1import UIKit 2import Alamofire 3 4class gamelistViewController: UIViewController { 5 //@IBOutlet weak var glNavigationBar: UINavigationBar! 6 //ここはあまり質問と関係ないです 7 8 struct JSONFeed: Codable { 9 let status: String 10 let message: String 11 let isExist: Bool 12 } 13 14 override func viewDidLoad() { 15 super.viewDidLoad() 16 17 } 18 19 20 21 @IBAction func playBingo(_ sender: Any) { 22 23 callJSON() 24 25 if JSONFeed.isExist = false { 26 self.performSegue(withIdentifier: "toBT", sender: "nil") 27 } else { 28 self.performSegue(withIdentifier: "backtoLI", sender: "nil") 29 } 30 } 31 32 func callJSON() { 33 34 let listUrl = "http://foo.bar/test" 35//foo.barの部分は諸事情で伏せています 36 37 Alamofire.request(listUrl).validate().responseJSON {response in 38 guard let json = response.data else { 39 return 40 } 41 print(json) 42 let decoder = JSONDecoder() 43 do { 44 let feed: JSONFeed = try decoder.decode(JSONFeed.self, from: json) 45 print(feed) 46 } catch { 47 print(error) 48 } 49 50 } 51 52 } 53 54 55 //中略 56 57}

func playBingoのところで

lang

1 @IBAction func playBingo(_ sender: Any) { 2 3 callJSON() 4 5 if JSONFeed.isExist = false { 6 self.performSegue(withIdentifier: "toBT", sender: "nil") 7 } else { 8 self.performSegue(withIdentifier: "backtoLI", sender: "nil") 9 } 10 }

としていますが、
if JSONFeed.isExist = false {
ここで
Instance member 'isExist' cannot be used on type 'gamelistViewController.JSONFeed'
が出てしまうのですが、ちょっと書き方がわかりません。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Alamofire.request()は非同期だと思うので、callJSON()の直後に参照してもダメです。
そもそも、JSONFeed.isExistでは参照できません。

また、もっと基本的なことですが、if文での比較は==ですし、Bool型の場合は等号/不等号は使いません。

ということで丸投げです。ビルド/動作確認はしていません。
callJSON()内、

swift

1 : 2print(feed) 3//受信完了したのでフラグを見て分岐する。 4DispatchQueue.main.async { //メインスレッドで実行するためのオマジナイ(必要ないかも) 5 if !feed.isExist { 6 self.performSegue(withIdentifier: "toBT", sender: "nil") 7 } else { 8 self.performSegue(withIdentifier: "backtoLI", sender: "nil") 9 } 10}

投稿2018/09/26 09:46

編集2018/09/26 09:46
fuzzball

総合スコア16731

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

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

NyoroNyoroKo

2018/09/26 10:03

真似してみましたが"Invalid conversion from throwing function of type '(_) throws -> ()' to non-throwing function type '(DataResponse<Any>) -> Void'"と怒られてしまいました。 このエラーに関してStackOverflowに過去のSwiftのバージョンで質問と回答があったので調べてみてますが、通信が苦手すぎて不安しか残ってません。
NyoroNyoroKo

2018/09/26 10:09

書く場所を間違えていたみたいです。お騒がせしました。 テストも問題がなくsuceededになりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問