You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Core Data中@FetchRequest能否仅获取特定UUID字段?

问题

有没有简洁的方式通过Core Data的@FetchRequest仅获取单个字段,以此判断特定UUID是否存在于查询结果中?

我现有一个查询,返回一组Token列表,每个Token都有UUID类型的id:

@FetchRequest(sortDescriptors: [SortDescriptor(\.id)])
var tokens: FetchedResults<Token>

我尝试写一个判断Token是否已下载的函数,初始写法如下:

func isDownloaded(tokenId: UUID) -> Bool {
    return tokens.contains(tokenId)
}

能不能修改@FetchRequest使其仅返回Token的id列表?我试了下面的写法:

@FetchRequest(sortDescriptors: [SortDescriptor(\.id)])
var tokens: FetchedResults<Token.ID>

结果报错:

Type 'Token.ID' (aka 'Optional') does not conform to protocol 'NSFetchRequestResult'

我查过相关内容,但都是关于插入前检查记录是否存在的,不是我要的场景。我需要获取Core Data中已下载Token的id列表来控制下载按钮状态,每次循环单独查询太繁琐。


解决方案

直接优化判断逻辑

不需要修改@FetchRequest的返回字段,直接利用现有FetchedResults<Token>,通过contains(where:)方法就能高效完成判断,代码简洁且满足需求:

func isDownloaded(tokenId: UUID) -> Bool {
    tokens.contains(where: { $0.id == tokenId })
}

关于FetchedResults<Token.ID>报错的原因

FetchedResults要求泛型类型必须遵循NSFetchRequestResult协议,而Token.ID本质是Optional<UUID>,并不符合该协议,因此会触发报错。如果确实需要仅获取id字段,可以通过Core Data的NSFetchRequest设置propertiesToFetch属性来实现,但对于你的场景来说,上面的判断逻辑已经足够高效,没必要额外做复杂处理。


更新

根据社区开发者的回复,最终采用的简洁实现就是上述contains(where:)版本,无需修改原有@FetchRequest即可完成需求。

内容的提问来源于stack exchange,提问作者lcj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 09:52:08