SwiftData布尔字段排序报错,如何让已完成任务排在列表底部?
问题解决:SwiftData @Query排序布尔字段报错
报错原因
直接使用SortDescriptor(\TodoTask.isDone)时,Swift无法找到匹配的初始化器——对于Bool类型的属性,必须显式指定排序顺序(即使使用默认规则),否则会触发「No exact matches in call to initializer」错误。
正确写法
要实现isDone == true的任务排在列表底部,只需给Bool字段的SortDescriptor明确指定排序顺序即可。结合你的日期排序需求,最终代码如下:
@Query(sort: [ SortDescriptor(\TodoTask.expectedOn, order: .reverse), SortDescriptor(\TodoTask.isDone, order: .forward) ]) var todoTasks: [TodoTask]
逻辑说明
Bool类型的比较规则是false < true,使用.forward排序顺序时,未完成的任务(isDone = false)会被排在前面,已完成的任务(isDone = true)自然落在列表底部,完全符合你的需求。显式传入order参数后,初始化器就能正确匹配,报错问题即可解决。
内容的提问来源于stack exchange,提问作者Alloys
相关产品推荐
相关产品推荐

