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

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

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

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

Q&A

解決済

1回答

422閲覧

【swift】structでreturnする方法

akihir

総合スコア39

Swift

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

0グッド

0クリップ

投稿2020/04/04 13:37

以下を参考してGAS⇔swiftの連携しようとしています。

https://qiita.com/saenuruki/items/01f713b14ea632e606e0

以下はswiftコードです。

swift

1import Foundation 2 3struct APIRequest { 4 5 static let mainAPIHost: String = "https://script.google.com/macros/s/AKf****************swg/exec" 6 7 static func getSheetData(){ 8 9 var request = URLRequest(url: URL(string: mainAPIHost)!) 10 request.httpMethod = "GET" 11 let task = URLSession.shared.dataTask(with: request) { data, response, error in 12 guard let jsonData = data else { return } 13 14 struct Result: Codable { 15 var vitals: [Vital] 16 } 17 18 do { 19 let vitals = try JSONDecoder().decode(Result.self, from: jsonData) 20 print(vitals) 21 } catch { 22 print(error.localizedDescription) 23 } 24 } 25 task.resume() 26 } 27} 28 29struct Vital: Codable { 30 var id: String 31 var name: String 32 var nameJP: String 33 var description: String 34 var usage: String 35}

最終的に[vitals]に含めたResult型のデータがprintで出力されるのですが、
今回はreturnしてデータを抜き出すことを目標にしています。
どのようにしたらvitalsを引き出すことができるかご教授ください。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

hoshi-takanoriさんのコメントのとおりなのですが、裏でコードをサンプルコードを書いてしまっていたので掲載します。

処理の流れをわかりやすくするため、Playground でも動くコードにしてあります。GASは使っていないので、手頃で使いやすい Web API の処理(郵便番号検索)でやっていますが、基本的な流れは提示されたコードを使っていますので、比較は簡単に行えると思います。

swift

1import Foundation 2 3// 郵便番号検索 API を利用 4// zhttps://zip-cloud.appspot.com/doc/api 5struct ZipCode : Codable { 6 var results : [Result] 7} 8 9struct Result : Codable { 10 var address1 : String 11 var address2 : String 12 var address3 : String 13 var zipcode : String 14} 15 16struct APIRequest { 17 static let mainAPIHost: String = "https://zip-cloud.appspot.com/api/search?zipcode=3050005" 18 // getSheetDataの引数としてクロージャを渡している 19 static func getSheetData(completion: @escaping (ZipCode?, String?) -> Void){ 20 var request = URLRequest(url: URL(string: mainAPIHost)!) 21 request.httpMethod = "GET" 22 23 // 以下の行もクロージャとして処理している 24 let task = URLSession.shared.dataTask(with: request) { data, response, error in 25 if let jsonData = data, error == nil { 26 do { 27 let zipCode = try JSONDecoder().decode(ZipCode.self, from: jsonData) 28 29 DispatchQueue.main.async(execute: { 30 completion(zipCode, nil) 31 }) 32 // 上の三行は次のように書いても同じ(クロージャの省略形) 33 //DispatchQueue.main.async { 34 // completion(zipCode, nil) 35 //} 36 } catch { 37 DispatchQueue.main.async { 38 completion(nil, error.localizedDescription) 39 } 40 } 41 } else { 42 DispatchQueue.main.async { 43 completion(nil, error?.localizedDescription) 44 } 45 } 46 } 47 task.resume() 48 } 49} 50 51// クロージャを引数としてメソッドを呼び出す 52APIRequest.getSheetData(completion: { zip, error in 53 if let zip = zip { 54 // 郵便番号データが取得できた場合 55 // とりあえず生データとして dump する 56 dump(zip) 57 } else if let error = error { 58 // 郵便番号データが取得できなかったが、エラーメッセージは取得できなかった場合 59 print("error:", error) 60 } else { 61 print("Unknown error") 62 } 63}) 64 65// 上記の書き方は次とおなじ。これもクロージャの省略形 66//APIRequest.getSheetData { zip, error in 67// // 中略 68//} 69 70// 実際に結果が得られるのは、「Done.」が表示された後のことが多い 71print("Done.")

投稿2020/04/05 07:35

TsukubaDepot

総合スコア5086

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問