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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Core Data

Core DataはAppleのOS X and iOSのためのオブジェクトモデリングと持続性を持ったフレームワークです。Xcodeはエンティティー、属性そして関係性を特定するためのオブジェクトモデルの編集機能を提供します。

Swift

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

Q&A

解決済

1回答

1602閲覧

FetchedRequest.wrappedValue.getterでEXC_BAD_INSTRUCTIONが出てしまう

toshi_ki

総合スコア17

Core Data

Core DataはAppleのOS X and iOSのためのオブジェクトモデリングと持続性を持ったフレームワークです。Xcodeはエンティティー、属性そして関係性を特定するためのオブジェクトモデルの編集機能を提供します。

Swift

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

0グッド

0クリップ

投稿2020/06/21 16:36

#やりたいこと
SwiftUIでCoreDataを用いたプロジェクトを作っています。
CoreDataから取得したデータ(FetchedResults)の要素数ごとにViewを変えたり処理を変えたりしたいです。

(コードを見ていただいた方が早いかもしれません)

#起きている現象

ビルドは通りますが、シミュレーター実行時にEXC_BAD_INSTRUCTIONが出てしまいます。
デバッグナビゲーターによると、ContentView.users.getterのFetchRequest.wrappedValue.getter
でエラーが起きている様子です。

#環境
macOS Catalina 10.15.5
XCode11.5

質問者:SwiftUI初学者

#コード

ContentView

1import SwiftUI 2import CoreData 3 4struct ContentView: View { 5 @Environment(.managedObjectContext) var moc 6 @FetchRequest(entity: UserInfo.entity(), sortDescriptors: []) var users: FetchedResults<UserInfo> 7 8 //var users = User() 9 10 var body: some View { 11 NavigationView { 12 ScrollView(.vertical) { 13 if users.count == 0 { 14 Text("No Data") 15 } else { 16 Text("There are (users.count) data)") 17 } 18 } 19 .navigationBarTitle("User List") 20 } 21 22 } 23 24 init() { 25 var userData = [UserData]() 26 if users.count == 0 { //←←ここでエラーが発生 27 //usersが空の時の処理をここに書く 28 } 29 } 30}

UserInfoエンティティのNSManagedObject subclassの中身はこんな感じです。

UserInfoCoreDataProperties

1extension UserInfo { 2 3 @nonobjc public class func fetchRequest() -> NSFetchRequest<UserInfo> { 4 return NSFetchRequest<UserInfo>(entityName: "UserInfo") 5 } 6 7 @NSManaged public var about: String? 8 @NSManaged public var adress: String? 9 @NSManaged public var age: Int16 10 @NSManaged public var company: String? 11 @NSManaged public var email: String? 12 @NSManaged public var id: String? 13 @NSManaged public var isActive: Bool 14 @NSManaged public var name: String? 15 @NSManaged public var registered: String? 16 @NSManaged public var tags: Array<String>? 17 @NSManaged public var friends: NSSet? 18 19 public var friendsArray: [Friend] { 20 let set = friends as? Set<Friend> ?? [] 21 return set.sorted() { 22 $0.wrappedName < $1.wrappedName 23 } 24 } 25 26 public var wrappedAbout: String { 27 about ?? "No Information." 28 } 29 30 public var wrappedAdress: String { 31 adress ?? "Unknown Adress" 32 } 33 34 public var wrappedCompany: String { 35 company ?? "Not in Job" 36 } 37 38 public var wrappedEmail: String { 39 email ?? "No email adress" 40 } 41 42 public var wrappedId: String { 43 id ?? "Unknown ID" 44 } 45 46 public var wrappedName: String { 47 name ?? "Unknown Name" 48 } 49 50 public var wrappedRegistered: String { 51 registered ?? "No data" 52 } 53 54 public var wrappedTags: Array<String> { 55 tags ?? ["No tags"] 56 } 57} 58 59// MARK: Generated accessors for friends 60extension UserInfo { 61 62 @objc(addFriendsObject:) 63 @NSManaged public func addToFriends(_ value: Friend) 64 65 @objc(removeFriendsObject:) 66 @NSManaged public func removeFromFriends(_ value: Friend) 67 68 @objc(addFriends:) 69 @NSManaged public func addToFriends(_ values: NSSet) 70 71 @objc(removeFriends:) 72 @NSManaged public func removeFromFriends(_ values: NSSet) 73 74} 75

関係ないかもしれませんが、UserInfoと関連づけられているFriendエンティティのNSManagedObject subclassのコードも載せておきます。

FriendCoreDataProperties

1extension Friend { 2 3 @nonobjc public class func fetchRequest() -> NSFetchRequest<Friend> { 4 return NSFetchRequest<Friend>(entityName: "Friend") 5 } 6 7 @NSManaged public var id: String? 8 @NSManaged public var name: String? 9 @NSManaged public var user: UserInfo? 10 11 public var wrappedName: String { 12 name ?? "Unknown Name" 13 } 14}

最後まで見ていただきありがとうございます。
もし何かアイデアがあればご教授願えると幸いです。

よろしくお願いします。

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

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

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

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

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

hoshi-takanori

2020/06/22 01:26

たぶん init ではなく body に書くべきなのでは。
toshi_ki

2020/06/22 02:15

bodyのonAppear内に書いてみたらうまくいきました! まだまだ初学者でinitとonAppearの違いが分かってなかったから起きたことかなと思います。 ありがとうございます!
guest

回答1

0

自己解決

質問への修正依頼欄で的確に教えてくれた方がいました。
なので自己解決とさせていただきます。

なぜうまくいっていなかったかと言うと、
FetchedResult型にinitでアクセスしようとしていたから。

なのでContentsView.swiftのinitのコードを
そのままbody内のonAppearの中に記述したところ上手く行きました。

投稿2020/06/22 02:22

toshi_ki

総合スコア17

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問