在@FetchRequest 中输入一个动态值,以从 SwiftUI 中的核心数据中获取单个实体
Input a dynamic value into @FetchRequest, to fetch a single entity from core data in SwiftUI
我看到了相同类型的错误,但这里的代码类型不同,所以我认为最好就此上下文提出一个新问题。我试图通过尝试将名为 title
的字符串变量(用作查找该实体的键)传递到 @FetchRequest
来从核心数据中 "find a specific entity"。这是我使用的部分代码
struct AccountMainPage: View {
//*** User input ***
var title: String
//*** Core data enviroment initialisation ***
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
@Environment(\.managedObjectContext) var managedObjectContext
@FetchRequest(fetchRequest: Accounts.getSpecificAccounts(findTitle: title)) var fetchedAccount: FetchedResults<Accounts>
var body: some View {
//SOME CODE HERE
}
}
public class Accounts
的扩展名:
extension Accounts {
static func getSpecificAccounts(findTitle: String) -> NSFetchRequest<Accounts> {
let request: NSFetchRequest<Accounts> = Accounts.fetchRequest() as! NSFetchRequest<Accounts>
let findDescriptor = NSPredicate(format: "title == %@",findTitle)
request.predicate = findDescriptor
return request
}
}
然而,带有@FetchRequest(fetchRequest: Accounts.getSpecificAccounts(findTitle: title)) var fetchedAccount: FetchedResults<Accounts>
的行有一个语法错误:
Cannot use instance member 'title' within property initializer; property initializers run before 'self' is available
我的代码有问题吗?
@FetchRequest
是动态的 属性,与任何其他 属性 一样,在调用 AccountMainPage
init
之前被初始化,因此 self
尚不可用,这就是为什么您不能使用 title
属性 的原因,它是 self
的成员,这就是编译器错误告诉我们的内容。
所以这是一个可能的解决方案:我们用存根请求初始化获取请求 属性,然后在稍后调用的 init
中,用真正的获取请求重新初始化它。
这里是一个方法演示(所有无关的东西都删掉了):
struct ContentView: View {
var title: String
@Environment(\.managedObjectContext) var managedObjectContext
@FetchRequest(fetchRequest: Accounts.fetchRequest()) var fetchedAccount: FetchedResults<Accounts>
init(title: String) {
self.title = title
_fetchedAccount = FetchRequest<Accounts>(fetchRequest: Accounts.getSpecificAccounts(findTitle: title))
}
...
我看到了相同类型的错误,但这里的代码类型不同,所以我认为最好就此上下文提出一个新问题。我试图通过尝试将名为 title
的字符串变量(用作查找该实体的键)传递到 @FetchRequest
来从核心数据中 "find a specific entity"。这是我使用的部分代码
struct AccountMainPage: View {
//*** User input ***
var title: String
//*** Core data enviroment initialisation ***
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
@Environment(\.managedObjectContext) var managedObjectContext
@FetchRequest(fetchRequest: Accounts.getSpecificAccounts(findTitle: title)) var fetchedAccount: FetchedResults<Accounts>
var body: some View {
//SOME CODE HERE
}
}
public class Accounts
的扩展名:
extension Accounts {
static func getSpecificAccounts(findTitle: String) -> NSFetchRequest<Accounts> {
let request: NSFetchRequest<Accounts> = Accounts.fetchRequest() as! NSFetchRequest<Accounts>
let findDescriptor = NSPredicate(format: "title == %@",findTitle)
request.predicate = findDescriptor
return request
}
}
然而,带有@FetchRequest(fetchRequest: Accounts.getSpecificAccounts(findTitle: title)) var fetchedAccount: FetchedResults<Accounts>
的行有一个语法错误:
Cannot use instance member 'title' within property initializer; property initializers run before 'self' is available
我的代码有问题吗?
@FetchRequest
是动态的 属性,与任何其他 属性 一样,在调用 AccountMainPage
init
之前被初始化,因此 self
尚不可用,这就是为什么您不能使用 title
属性 的原因,它是 self
的成员,这就是编译器错误告诉我们的内容。
所以这是一个可能的解决方案:我们用存根请求初始化获取请求 属性,然后在稍后调用的 init
中,用真正的获取请求重新初始化它。
这里是一个方法演示(所有无关的东西都删掉了):
struct ContentView: View {
var title: String
@Environment(\.managedObjectContext) var managedObjectContext
@FetchRequest(fetchRequest: Accounts.fetchRequest()) var fetchedAccount: FetchedResults<Accounts>
init(title: String) {
self.title = title
_fetchedAccount = FetchRequest<Accounts>(fetchRequest: Accounts.getSpecificAccounts(findTitle: title))
}
...