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

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

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

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JSON

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

Swift

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

Q&A

1回答

431閲覧

[Swift4.1 - Xcode9.4.1]Googleスプレットシートの情報をJSONで取得し、そのデータをSwiftを使ってiOSアプリで表示させたい

退会済みユーザー

退会済みユーザー

総合スコア0

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JSON

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

Swift

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

0グッド

1クリップ

投稿2018/07/27 08:04

編集2018/07/27 12:26

最近Swiftを書き始めた者なので、易しく回答していただけると幸いです。
現在私は、Googleスプレットシートに載っている情報をJSONデータとして取得し、その取得したデータを画面表示させるiOSアプリを作っています。
Qiita等のサイトをあさりながら一通り作ったのですが、画面表示がされずに行き詰まっています。
以下iOSのSwiftのソースコードです。

###Swiftのソースコード

import UIKit import Foundation class ViewController: UIViewController { @IBOutlet weak var JsonLabel1: UILabel! @IBOutlet weak var JsonLabel2: UILabel! @IBOutlet weak var JsonLabel3: UILabel! @IBOutlet weak var JsonLabel4: UILabel! override func viewDidLoad() { super.viewDidLoad() struct JsonData : Codable{ var Name : String var Age : Int var Height : Int var Weight : Int } let UrlString = "ここにJSONデータを出力するURLを入力" guard let url = URL(string: UrlString) else{ return } URLSession.shared.dataTask(with: url) { (data, response, error) in if error != nil { print(error!.localizedDescription) } guard let data = data else { return } let decoder = JSONDecoder() let JsonCode = try? decoder.decode(JsonData.self, from: data) self.JsonLabel1.text = JsonCode?.Name self.JsonLabel2.text = JsonCode?.Age self.JsonLabel3.text = JsonCode?.Height self.JsonLabel4.text = JsonCode?.Weight }.resume() } }

GAS側については正常にURLが生成され、JSONデータを吐き出してくれているのですが、iOS側でプログラムを実際に実行してみると思うように動きません。

###エラーメッセージ

Cannot assign value of type 'Int?' to type 'String?'

該当のソースコード

self.JsonLabel2.text = JsonCode?.Age self.JsonLabel3.text = JsonCode?.Height self.JsonLabel4.text = JsonCode?.Weight

###訂正後

self.JsonLabel1.text = JsonCode?.Name //self.JsonLabel2.text = JsonCode?.Age //self.JsonLabel3.text = JsonCode?.Height //self.JsonLabel4.text = JsonCode?.Weight

試したこと

エラーについて試したことですが、最初の「Cannot assign value of type 'Int?' to type 'String?'」については代入する型が違うということで、何が悪いかはわかっていますが、具体的な解決策が思いつきません。UILabelではなく、他のものを使えば改善されるのでしょうか?
そして次の問題が一番わかっていないのですが、上記のエラーの部分を一旦コメントアウトして実行したところ、エラーはなく、正常にコンパイルはできました。
しかし、実際にシュミレータや実機に実装してアプリを立ち上げてみると、「JsonLabel1」のところが消えるだけで、取得したはずのデータが表示されません(JsonLabel2〜4については何も変更を加えていないので、「JsonLabel2」などと表示されたままです)。
ここに問題に対して試したことを記載してください。

補足情報

View Controllerの画面を貼っておきます。

View Controllerの画面
イメージ説明

このような感じになっています。
初心者なので、至らぬ点が多々あると思いますが、ご教示いただけますと幸いです。
よろしくお願いします。

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

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

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

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

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

t_obara

2018/07/27 08:39

本質問にGoogleスプレッドシート部分は全く無関係ですよね?エラーメッセージが一番の問題です、その点を解決したいのであれば、その点を明確にわかるような質問をされることをお勧めいたします。
退会済みユーザー

退会済みユーザー

2018/07/27 12:22

ご指摘ありがとうございます。修正させていただきます。
guest

回答1

0

Int → String の変換はString(Intの値)で簡単に出来るのですが、JsonCode?.AgeなどがInt?型なので、このままでは変換が出来ません。

今回は、Optional Binding(if let)を使って、JsonCodeのnilチェック&アンラップを行い、場合分けをしてみます。

swift

1if let jsonCode = JsonCode { 2 self.JsonLabel1.text = jsonCode.Name 3 self.JsonLabel2.text = String(jsonCode.Age) 4 self.JsonLabel3.text = String(jsonCode.Height) 5 self.JsonLabel4.text = String(jsonCode.Weight) 6} else { 7 //JsonCodeがnilだったときの処理。例えば... 8 self.JsonLabel1.text = "-" 9 self.JsonLabel2.text = "-" 10 self.JsonLabel3.text = "-" 11 self.JsonLabel4.text = "-" 12}

※動作確認はしていません

投稿2018/07/27 08:57

fuzzball

総合スコア16731

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

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

退会済みユーザー

退会済みユーザー

2018/07/27 13:00

ご回答ありがとうございます。 早速試させていただきました。 実行した結果、nilだった場合の出力がされました。 これはJSONの取得がうまくいっていないという事でしょうか? また、   self.JsonLabel1.text = jsonCode.Name self.JsonLabel2.text = String(jsonCode.Age) self.JsonLabel3.text = String(jsonCode.Height) self.JsonLabel4.text = String(jsonCode.Weight) のところに「UILabel.text must be used from main thread only」という警告が出てきました。 以前にもこの警告文が出てきたのですが、これはURLSessionの外に書けということでよろしいでしょうか? もしそうだとして、外に書くと「jsonCodeを見つけられません」みたいなエラーが出ると思うのですが、その対策について教えていただきたいです。 よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問