构建通用的 getObjectByID 函数

问题描述 投票:0回答:1

我构建了一个 Swift 函数,通过特定 SwiftData 类的 id 获取对象,效果很好。现在我尝试将其重建为通用函数以与不同的类一起使用。我的代码如下所示:

func getObjectByID<T: PersistentModel>(context: ModelContext, id: Int) -> T? {
        
        do {
            let predicate = #Predicate<T> {
                id == $0.id
            }
            let descriptor = FetchDescriptor<T>(predicate: predicate)
            let objects = try context.fetch(descriptor)
            return objects.first
        } catch {
            return nil
        }
    }

出现 2 个错误:

  • id == $0.id 的行有错误:“运算符函数 '==' 要求 'PersistentIdentifier' 符合 'BinaryInteger'”
  • let objects = try context.fetch(descriptor) 的行有错误:无法推断通用参数“T”

为什么会出现这些错误以及如何解决这些问题?

我尝试过(上下文:ModelContext,id:任何 BinaryInteger)但没有成功

swift generics
1个回答
0
投票

首先,

id
类型的
PersistentModel
属性是
PersistentIdentifier
。所以函数签名应该是

func getObjectByID<T: PersistentModel>(context: ModelContext, id: PersistentIdentifier) -> T? 

这修复了编译错误,但您可以使用函数来代替使用带谓词的 fetch

model(for:)

func getObjectByID<T: PersistentModel>(context: ModelContext, id: PersistentIdentifier) -> T? {
    context.model(for: id) as? T
}

或者完全跳过这个自定义函数并直接调用

model(for:)

© www.soinside.com 2019 - 2024. All rights reserved.