If statement 将嵌套的条件If语句转换为复杂的NSCompoundPredicate

If statement 将嵌套的条件If语句转换为复杂的NSCompoundPredicate,if-statement,core-data,swiftui,swiftui-list,nscompoundpredicate,If Statement,Core Data,Swiftui,Swiftui List,Nscompoundpredicate,我正在使用SwiftUI为一个旧的基于iOS的项目编写macOS目标。Is是一个核心数据驱动的应用程序,对于macOS目标,我已经使用动态@FetchRequest成功地实现了通用列表,主要如Paul Hudson在他的文章中所述 我主要是通过遵循苹果的做法并复制提供的示例代码来构建目标 以前使用的条件if语句根据3个UI控件主动筛选每个SwiftUI列表 现在我有了一个使用谓词的泛型@FetchRequest,我想将这个条件if语句转换成NSCompoundPredicate 我将包含整个初

我正在使用SwiftUI为一个旧的基于iOS的项目编写macOS目标。Is是一个核心数据驱动的应用程序,对于macOS目标,我已经使用动态@FetchRequest成功地实现了通用列表,主要如Paul Hudson在他的文章中所述

我主要是通过遵循苹果的做法并复制提供的示例代码来构建目标

以前使用的条件if语句根据3个UI控件主动筛选每个SwiftUI
列表

现在我有了一个使用谓词的泛型@FetchRequest,我想将这个条件if语句转换成
NSCompoundPredicate

我将包含整个初始化器,这样您就可以看到动态@FetchRequest是如何构建的,但我需要帮助的是谓词

init(sortDescriptors: [NSSortDescriptor],
     searchKey: String,
     searchValue: String?,
     showFavourites: Bool,
     filterKey: String,
     filter: FilterType,
     @ViewBuilder content: @escaping (T) -> Content) {

    let entity = T.entity
    let predicateTrue = NSPredicate(value: true)
// PART 1
    let predicateFavourite = showFavourites == false ? predicateTrue : NSPredicate(format: "isFavourite == TRUE")
// PART 2
    let predicateSearch = searchValue?.count == 0 ? predicateTrue : NSPredicate(format: "%K CONTAINS[cd] %@", searchKey, searchValue!)

    // The initialiser works perfectly down to this point...then...
// PART 3
    let predicateFilterName = filter == .all ? predicateTrue : NSPredicate(format: "%K == %@", filterKey, filter.name as CVarArg)
    let predicateFilterFeature = filter.category == .featured ? NSPredicate(format: "isFeatured == TRUE") : predicateTrue

    let predicateOr = NSCompoundPredicate(orPredicateWithSubpredicates: [predicateFilterName, predicateFilterFeature])
    let predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [predicateFavourite, predicateSearch, predicateOr])

    fetchRequest =
        FetchRequest<T>(entity: entity,
                        sortDescriptors: sortDescriptors,
                        predicate: predicate)

    self.content = content
}

我认为问题在于:

 let predicateFilterFeature = filter.category == .featured ? NSPredicate(format: "isFeatured == TRUE") : predicateTrue
如果筛选器为
.lakes
etc,则此子预测将为TRUE,当与
predicateFilterName
进行OR运算时,此子预测将覆盖它。尝试返回FALSE:

 let predicateFilterFeature = filter.category == .featured ? NSPredicate(format: "isFeatured == TRUE") : predicateFalse

我的答案是错误的,因为这是一个黑客破解的解决方案,我是在尝试以不同的方式思考谓词的构造后偶然发现的。(这并没有表明我对理解我所写的谓词语法的实际问题有任何仔细的思考!)

所以这个回答并没有回答我最初的问题,@pbasdf已经回答了这个问题,尽管这个回答得到了相同的结果

那么,也许是另一种解决方案

let predicateTrue = NSPredicate(value: true)

let predicateFavourite = showFavourites == false ? predicateTrue : NSPredicate(format: "isFavourite == TRUE")

let predicateSearch = searchValue?.count == 0 ? predicateTrue : NSPredicate(format: "%K CONTAINS[cd] %@", searchKey, searchValue!)

let predicateFilterFeatured = NSPredicate(format: "isFeatured == TRUE")
let predicateFilterName = NSPredicate(format: "%K == %@", filterKey, filter.name as CVarArg)
let predicateFilterCategory = filter.category == .featured ? predicateFilterFeatured : predicateFilterName

let predicateFilter = filter == .all ? predicateTrue : predicateFilterCategory

let predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [predicateFavourite, predicateSearch, predicateFilter])

谢谢你,这很有效。。。一个简单的解决方案,工作完美。我花了好几个小时来研究这个问题,应该停下来好好想想。
 let predicateFilterFeature = filter.category == .featured ? NSPredicate(format: "isFeatured == TRUE") : predicateFalse
let predicateTrue = NSPredicate(value: true)

let predicateFavourite = showFavourites == false ? predicateTrue : NSPredicate(format: "isFavourite == TRUE")

let predicateSearch = searchValue?.count == 0 ? predicateTrue : NSPredicate(format: "%K CONTAINS[cd] %@", searchKey, searchValue!)

let predicateFilterFeatured = NSPredicate(format: "isFeatured == TRUE")
let predicateFilterName = NSPredicate(format: "%K == %@", filterKey, filter.name as CVarArg)
let predicateFilterCategory = filter.category == .featured ? predicateFilterFeatured : predicateFilterName

let predicateFilter = filter == .all ? predicateTrue : predicateFilterCategory

let predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [predicateFavourite, predicateSearch, predicateFilter])