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

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

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

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

Swift

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

Q&A

解決済

1回答

2391閲覧

【SwiftUI】配列化した構造体をファイル間で共有したい

kghrk

総合スコア2

Xcode

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

Swift

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

0グッド

0クリップ

投稿2022/03/15 00:46

編集2022/03/15 00:50

こんにちは。

ファイル間で共有する構造体を作りたいです。
@EnvironmentObjectというものを知り、実際に使ってみたのですが、エラーが2つ出てしまい。うまくいきません。

//Argument passed to call that takes no arguments //Generic struct 'EnvironmentObject' requires that '[Items]' conform to 'ObservableObject'

原因と解決策をご教授願いたいです。

Swift

1import SwiftUI 2 3// 構造体を定義 4class Items: ObservableObject, Identifiable { 5 var id: String { 6 return name 7 } 8 @Published var name: String 9 @Published var color: Color 10 11 init(name: String, color: Color) { 12 self.name = name 13 self.color = color 14 } 15} 16 17struct ContentView: View { 18 // 構造体の中身を決めて、配列化する 19 @EnvironmentObject var items: [Items] = [ 20 //Argument passed to call that takes no arguments 21 //Generic struct 'EnvironmentObject' requires that '[Items]' conform to 'ObservableObject' 22 Items(name: "Apple", color: .red), 23 Items(name: "Orange", color: .orange), 24 Items(name: "Banana", color: .yellow), 25 ] 26 27 28 var body: some View { 29 VStack { 30 // 構造体をリスト(ボタン)化する 31 ForEach(items) { item in 32 Button(action: { 33 print(item) 34 35 }) { 36 HStack { 37 Text(item.name) 38 Spacer() 39 Image(systemName: "plus") 40 } 41 .frame(width: 320, height: 30, alignment: .leading) 42 .padding() 43 .foregroundColor(.white) 44 .background(item.color) 45 .cornerRadius(5) 46 } 47 } 48 } 49 } 50}

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

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

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

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

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

guest

回答1

0

ベストアンサー

配列はそれ自体が型だと思います。
ですので、Items[Items]の型は異なります。
Items型がObservableObjectプロトコルに準拠していたとしても、[Items]はObservableObjectプロトコルに準拠していないため、エラーになっていると思います。
(@EnvironmentObjectで指定するプロパティはObservableObjectプロトコルに準拠している必要があります)

Section 4 Use an Observable Object for Storage
Step 4 Add the @Published attribute to the landmarks array.

swift

1final class ModelData: ObservableObject { 2 @Published var landmarks: [Landmark] = load("landmarkData.json") 3}

Section 5 Adopt the Model Object in Your Views
Step 1 In LandmarkList.swift, add an @EnvironmentObject property declaration to the view, and an environmentObject(_:) modifier to the preview.

swift

1struct LandmarkList: View { 2 @EnvironmentObject var modelData: ModelData 3 // ...省略... 4 5struct LandmarkList_Previews: PreviewProvider { 6 static var previews: some View { 7 LandmarkList() 8 .environmentObject(ModelData()) 9 } 10}

https://developer.apple.com/tutorials/swiftui/handling-user-input#Use-an-Observable-Object-for-Storage

SwiftUIのチュートリアルを参考にしますと、配列型のプロパティを持つクラス自体をObservableObjectプロトコルに準拠する形にして、このModelDataを@EnvironmentObjectとして使っているようです。

それから、@EnvironmentObjectは、ビューの外からインスタンスが渡されますので(ビューを使う側が渡す必要がありますので)、@EnvironmentObjectの行で配列の初期化などするとエラーになってしまうようです。

ほかに読んでおいた方が良さそうなリンクも記載します。

https://docs.swift.org/swift-book/LanguageGuide/ClassesAndStructures.html
https://docs.swift.org/swift-book/LanguageGuide/CollectionTypes.html
https://developer.apple.com/documentation/swiftui/environmentobject

投稿2022/03/15 03:58

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kghrk

2022/03/16 01:31

実装できました。ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問