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

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

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

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

Swift

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

Q&A

解決済

2回答

1316閲覧

SwiftUIにおけるJSONファイル読み込みに関するエラー 【Cannot preview in this file - .app may have crashed】

Yusuke_X

総合スコア7

JSON

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

Swift

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

0グッド

0クリップ

投稿2020/02/11 13:06

実現したいこと

JSONファイルを扱うViewをSwiftUIチュートリアルを基に作成したい

エラーが出ないよう、チュートリアルとほぼ同じ形でコーディングしたのですが解決できないため質問させて頂きます。

発生している問題・エラーメッセージ

Cannot preview in this file - ***.app may have crashed.

該当のソースコード(SwiftUI Tutorialを基に作成)

json

1[ 2 { 3 "name": "とりひで", 4 "id":"001" 5 }, 6 { 7 "name":"きりんじ" 8 "id":"002" 9 10 } 11 12]

SwiftUI

1import SwiftUI 2 3struct ShopData: Hashable, Codable, Identifiable { 4 5 var name: String 6 var id: Int 7 8}

SwiftUI

1import SwiftUI 2 3struct ShopDataRow: View { 4 5 var shop: ShopData 6 7 var body: some View { 8 HStack { 9 Text(verbatim: shop.name) 10 } 11 } 12} 13 14 15struct LandmarkRow_Previews: PreviewProvider { 16 static var previews: some View { 17 Group { 18 ShopDataRow(shop: ShopDetail[0]) 19 ShopDataRow(shop: ShopDetail[1]) 20 } 21 .previewLayout(.fixed(width: 300, height: 70)) 22 } 23}

SwiftUI

1import SwiftUI 2 3let ShopDetail :[ShopData] = load("ShopDetail.json") 4 5func load<T: Decodable>(_ filename: String, as type: T.Type = T.self) -> T { 6 let data: Data 7 8 guard let file = Bundle.main.url(forResource: filename, withExtension: nil) 9 else { 10 fatalError("Couldn't find (filename) in main bundle.") 11 } 12 13 do { 14 data = try Data(contentsOf: file) 15 } catch { 16 fatalError("Couldn't load (filename) from main bundle:\n(error)") 17 } 18 19 do { 20 let decoder = JSONDecoder() 21 return try decoder.decode(T.self, from: data) 22 } catch { 23 fatalError("Couldn't parse (filename) as (T.self):\n(error)") 24 } 25}

試したこと

SwiftUI Tutorialとほぼ同じ形で作成し、Resumeするとエラーが出ます。
ご教授お願いします!!!

###実行環境

  • Xcode Version 11.3.1 (11C504)
  • macOS Catalina 10.15.1

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

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

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

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

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

guest

回答2

0

ベストアンサー

プレビューを作成する段階で、ShopDetailが初期化されていないのが原因でしょう。
プレビューはプログラム全体が起動しているのではなく、PreviewProviderの定義内だけ簡易的に実行する感じなので、その外にあるShopDetailは初期化されない状態で読み出されてしまうのかなと思います。

swift

1struct LandmarkRow_Previews: PreviewProvider { 2 static let shopDetail: [ShopData] = [ 3 ShopData(name: "とりひで", id: 1), 4 ShopData(name: "きりんじ", id: 2) 5 ] 6 static var previews: some View { 7 return Group { 8 ShopDataRow(shop: shopDetail[0]) 9 ShopDataRow(shop: shopDetail[1]) 10 } 11 .previewLayout(.fixed(width: 300, height: 70)) 12 } 13}

こんな風に静的に値を与えて使うのが、プレビューの意図している使い方なのかなと思っています。

SWIFTチュートリアル
なお、ここで説明されているように、var shop: ShopData@EnvironmentObject var shop: ShopData などとプロパティラッパーを使っていくようにする必要もあると思います。

投稿2020/02/12 10:10

編集2020/02/12 10:15
eytyet

総合スコア803

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

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

0

JSON の形式が間違っていそうです

var json = [ { "name": "とりひで", "id": 1001 }, { "name": "とりひで2", // カンマが足りていない "id": 1002 } ]

投稿2020/02/11 14:52

編集2020/02/11 14:53
unhappychoice

総合スコア1531

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

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

Yusuke_X

2020/02/12 00:27

ご回答ありがとうございます。 var json=を削除し、その上でご指摘の点を修正しましたが同様のエラーが表示されます。 その他気になるような点はありませんでしょうか?よろしくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問