#やりたいこと
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}
最後まで見ていただきありがとうございます。
もし何かアイデアがあればご教授願えると幸いです。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー