如何可选地初始化@FetchRequest

How to initialize @FetchRequest optionally

我的 SwiftUI 项目中有以下代码

@FetchRequest private var step: FetchedResults<Steps>
private var processID: UUID
private var stepID: UUID?

init(procID: UUID, stepID: UUID?) {
    if stepID != nil {
        let predicate = NSPredicate(format: "id == %@", stepID! as CVarArg)
        _step = FetchRequest<Steps>(sortDescriptors: [], predicate: predicate)
    }
    processID = procID
}

我想知道我是否可以以某种方式return 清空来自 init() 的步骤 FetchRequest,以防传递的 stepID 为零。当前未编译,因为 step var 未初始化。我试图将其设为可选,但编译器不喜欢它。

如果 stepID 为零,您总是可以 return a FALSEPREDICATE。这会给你一个空的 @FetchRequest,但是一个 non-optional 谓词参数。

init(procID: UUID, stepID: UUID?) {
    let predicate: NSPredicate
    if let stepID = stepID {
       predicate = NSPredicate(format: "id == %@", stepID as CVarArg)
    } else {
       // This will return a predicate that matches nothing, so your fetch
       // will be empty. 
       predicate = NSPredicate(format: "FALSEPREDICATE")
    }
        _step = FetchRequest<Steps>(sortDescriptors: [], predicate: predicate)

    processID = procID
}

传递给 FetchRequest 的 init 的谓词可以是 nil,所以你可以这样做:

private var fetchRequest: FetchRequest<Steps>
private var steps: FetchedResults<Steps> {
    fetchRequest.wrappedValue
}

init(stepID: UUID?) {
    let predicate: NSPredicate?
    if let stepID = stepID {
        predicate = NSPredicate(format: "id == %@", stepID)
    }
    else {
        predicate = nil
    }
    fetchRequest = FetchRequest(sortDescriptors: [], predicate: predicate)
}