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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

687閲覧

Swift Swiftuiのチュートリアル、受け取ったjsonデータからインスタンス生成する部分について

moriman

総合スコア615

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

1クリップ

投稿2020/01/24 06:19

https://developer.apple.com/tutorials/swiftui/building-lists-and-navigation

swift

1// LandmarkList.swift 2import SwiftUI 3 4struct LandmarkList: View { 5 var body: some View { 6 NavigationView{ 7 List (landmarkData) {landmark in 8 NavigationLink(destination: LandmarkDetail()){ 9 LandmarkRow(landmark: landmark) 10 } 11 }.navigationBarTitle(Text("Landmarks")) 12 } 13 } 14} 15 16struct LandmarkList_Previews: PreviewProvider { 17 static var previews: some View { 18 LandmarkList() 19 } 20}

上記のチュートリアルをやっているのですが、データの流れとして
一番最初にjsonデータ(landmarkData.json)をListクラスのイニシャライザが受け取る

Listイニシャライザの第二引数のクロージャーのパラメータlandmarkが、landmarkData.jsonの中の
一つ一つのランドマーク情報を受け取る

イニシャライザLandmarkRow()がパラメータlandmarkを受け取り、自身のプロパティにセットする、

という流れで、イニシャライザLandmarkRowが受け取るパラメータの型はLandmark型、
なので、Listイニシャライザがjsonデータ(landmarkData.json)を受け取ってから、
LandmarkRowイニシャライザがパラメータlandmarkを受け取るまでの間に自動的にjsonデータが
Landmark構造体インスタンスに変換されているように見えるのですが、これってどういう
仕組みなのでしょうか?
多分どこかで(内部的に自動的に)変換されているんだと思うんですが、そこが気になっていろいろ
調べたのですが、なかなか要領を得ません(すっきりしない状況)。

調べている途中でCodableプロトコルなど出てきて、Landmark型もCodableプロトコルに準拠しているので、
関係ありそうなので、

https://qiita.com/eg_19_/items/95d212a2f1ef14044c2f

など調べました。上記ページではCodableプロトコルに準拠することでjsonから構造体を生成するには、

let decoder: JSONDecoder = JSONDecoder() ... decoder.decode(User.self, from: rowData)

上記のようなコードが必要そうなのですが、チュートリアルを見てもそのようなコードが見当たりません。
ここの部分で止まったので最後までチュートリアルを動かしてはいませんが、公式に載っているので
多分これで問題なく動くのだと思いますが、上記のようなコードは必要ないのでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

上の方にXcodeプロジェクトをダウンロードできるリンクがあります。
そのプロジェクトを見ればわかりますが、チュートリアルには載っていないところ(Data.swift)でJSONをデコードして 定数 landmarkData (型はArray<Landmark>)に代入しています。

投稿2020/01/24 07:36

MasakiHori

総合スコア3384

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

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

moriman

2020/01/27 06:41

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問