编译器提示Cannot use instance member 'friend' within property initializer; property initializers run before 'self' is available
时间: 2023-08-03 14:03:39 浏览: 40
这个错误是因为 `@FetchRequest` 属性初始化器中的代码在初始化视图之前运行。也就是说, 当你试图在 `@FetchRequest` 中使用 `friend` 实例变量时,`friend` 可能还没有被初始化。
为了解决这个问题,你可以将 `@FetchRequest` 属性初始化器移动到视图的生命周期方法中,例如 `onAppear`,这样就可以访问 `friend` 实例变量。下面是一个简单的示例代码:
```
struct FriendChatHistoryView: View {
@Environment(\.managedObjectContext) private var viewContext
var friend: Friend // 这里假设你已经传入了 Friend 实例
@FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \ChatHistory.timestamp, ascending: true)])
var chatHistory: FetchedResults<ChatHistory>
var body: some View {
VStack {
// 渲染 Friend 信息
List(chatHistory) { history in
// 渲染 ChatHistory 信息
}
}
.onAppear {
chatHistory = FetchRequest(
entity: ChatHistory.entity(),
sortDescriptors: [NSSortDescriptor(keyPath: \ChatHistory.timestamp, ascending: true)],
predicate: NSPredicate(format: "fromFriend == %@", self.friend),
animation: .default
)
.fetchRequest()
}
}
}
```
在上面的代码中,我们将 `@FetchRequest` 属性初始化器移动到了 `onAppear` 方法中,并且使用 `self.friend` 来访问 `friend` 实例变量。这样就可以避免编译器错误并正确地获取 `friend` 对应的 ChatHistory 数组了。