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)
上記のようなコードが必要そうなのですが、チュートリアルを見てもそのようなコードが見当たりません。
ここの部分で止まったので最後までチュートリアルを動かしてはいませんが、公式に載っているので
多分これで問題なく動くのだと思いますが、上記のようなコードは必要ないのでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/27 06:41