Xcode 16中含SortDescriptor的FetchDescriptor触发Sendable警告求助
解决Xcode 16(Swift 6模式)下FetchDescriptor的Sendable警告问题
问题根源是Swift 6的Sendable严格检查机制:可选属性对应的ReferenceWritableKeyPath<Station, Optional<Int16>>不满足Sendable协议,而FetchDescriptor的sortBy参数要求元素必须符合Sendable。以下是几种可行的解决方案:
方案1:将可选属性改为非可选(推荐,若业务允许)
如果stationKey的默认值为0,且实际业务场景中不会为nil,直接移除可选标记即可彻底解决问题:
@Model public class Station { var stationKey: Int16 = 0 // 去掉问号,改为非可选类型 } extension Station { static func allFD() -> FetchDescriptor<Station> { let predicate = #Predicate<Station> { _ in true } let descriptor = FetchDescriptor(predicate: predicate, sortBy: [SortDescriptor(\.stationKey)]) return descriptor } }
此时KeyPath变为WritableKeyPath<Station, Int16>,天然符合Sendable规范,警告自动消失。
方案2:保留可选属性,显式生成符合Sendable的SortDescriptor
若必须保留stationKey的可选类型,可通过以下两种方式处理:
子方案2.1:用@Sendable闭包自定义排序逻辑
直接通过闭包定义可选值的排序规则,并显式标注闭包为@Sendable:
extension Station { static func allFD() -> FetchDescriptor<Station> { let predicate = #Predicate<Station> { _ in true } let sortDescriptor = SortDescriptor<Station>(@Sendable { a, b in // 自定义可选值排序逻辑,示例:nil排在最前面,非nil按数值排序 (a.stationKey ?? .min) < (b.stationKey ?? .min) }) let descriptor = FetchDescriptor(predicate: predicate, sortBy: [sortDescriptor]) return descriptor } }
子方案2.2:显式标注SortDescriptor的Sendable约束
通过类型标注强制让基于可选KeyPath创建的SortDescriptor符合Sendable:
extension Station { static func allFD() -> FetchDescriptor<Station> { let predicate = #Predicate<Station> { _ in true } let sortDescriptor: SortDescriptor<Station, Int16?> & Sendable = SortDescriptor(\.stationKey) let descriptor = FetchDescriptor(predicate: predicate, sortBy: [sortDescriptor]) return descriptor } }
如果你的allFD函数需要在并发环境中调用,建议给函数添加@Sendable注解:
static func allFD() -> FetchDescriptor<Station> @Sendable { // ... 原有代码 ... }
内容的提问来源于stack exchange,提问作者matyasl
相关产品推荐
相关产品推荐

