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

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

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

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

Q&A

解決済

1回答

1199閲覧

[Swift]配列型ではないJSONをデコードしたい

yasukun252

総合スコア34

Swift

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

0グッド

0クリップ

投稿2021/10/31 09:01

編集2021/10/31 09:03

前提・実現したいこと

Swiftで以下のようなContactの構造体作成して、APIから返ってくるcontactをデコードして値をTextに表示する方法がわかりません。
JSONは以下のようになっております。API通信の部分はAlamofireを使っております。

{ "contact": { "id": 1, "name": "テスト太郎", "email": "test@example.com", "message": "メッセージです。", "deleted_at": null, "created_at": "2021-08-01T11:15:31.184+09:00", "updated_at": "2021-08-01T11:15:31.184+09:00" } }

SwiftUIの部分は以下のようになっております。

struct Contact: Decodable, Identifiable, Encodable { var id: Int var name: String var email: String var message: String var deleted_at: String? var created_at: String var updated_at: String } class ContactFetcher: ObservableObject { @Published var contactData: Contact init() { fetchContactData() } # ここで以下のような2つのエラーが表示されてしまいます。 'self' used in method call 'fetchContactData' before all stored properties are initialized Return from initializer without initializing all stored properties func fetchContactData() { AF.request("http://127.0.0.1:3000/api/contacts/1.json", method: .get, encoding: URLEncoding.default).response { response in guard let json = response.data else { return } let decoder: JSONDecoder = JSONDecoder() do { let searchedResultData = try? decoder.decode(Contact.self, from: json) DispatchQueue.main.async { self.contactData = searchedResultData } } catch { print("json convert failed in JSONDecoder. " + error.localizedDescription) } debugPrint(response) } } } struct ContentView: View { @ObservedObject var fetcher = ContactFetcher() var body: some View { VStack { Text("(fetcher.contactData.email)") # このように表示したい } } }

以下のエラーの解消方法が分かりません。

'self' used in method call 'fetchContactData' before all stored properties are initialized Return from initializer without initializing all stored properties

是非アドバイスなどよろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ContactFetcherinit() において、初期化が完了していない(contactData プロパティの初期値が設定されていない)状態で fetchContactData() を呼び出しています。これがビルドエラーの原因です。

クラスの初期化時には、格納型プロパティ(Stored Property)に適切な初期値を設定しておく必要があります。

Setting Initial Values for Stored Properties

Classes and structures must set all of their stored properties to an appropriate initial value by the time an instance of that class or structure is created. Stored properties can’t be left in an indeterminate state.

You can set an initial value for a stored property within an initializer, or by assigning a default property value as part of the property’s definition. These actions are described in the following sections.

https://docs.swift.org/swift-book/LanguageGuide/Initialization.html

contactData プロパティにはAPIで取得した連絡先情報が格納されることになっていますが、 ContactFetcher の初期化時にはまだAPIを呼び出していないため contactData の値を nil とするのがよいと思います。

contactDatanil を設定できるようにするために、次のように型をオプショナルに変更します。この修正により、 ContactFetcherinit() が呼び出された時点では contactData プロパティの値には既にデフォルト値 nil が設定されているため、今度は「Return from initializer without initializing all stored properties」エラーが発生しなくなるはずです。

diff

1class ContactFetcher: ObservableObject { 2- @Published var contactData: Contact 3+ @Published var contactData: Contact?

また、contactDataを使用する場所でも、上記の型変更への対応が必要です。以下に修正の一例を示します。

diff

1struct ContentView: View { 2 @ObservedObject var fetcher = ContactFetcher() 3 4 var body: some View { 5 Stack { 6- Text("(fetcher.contactData.email)") 7+ Text("(fetcher.contactData?.email ?? "[emailの値を取得する前に表示する文字列]")") 8 } 9 } 10}

投稿2021/11/02 20:33

__k_san__

総合スコア177

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

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

yasukun252

2021/11/03 01:40 編集

ありがとうございます! エラーは解消されました。 しかし、「json convert failed in JSONDecoder. The data couldn’t be read because it is missing. 」「keyNotFound(CodingKeys(stringValue: "id", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: \"id\", intValue: nil) (\"id\").", underlyingError: nil))」というコンソール上でのエラーが発生しましたので、自分で調査してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問