首页 > 解决方案 > 使用 UUID 的 Swift 5 CoreData 谓词

问题描述

我有一个实体,我为其设置了一些 ID 作为 UUID 对象。我有这个功能来检查它是否已经记录在持久存储中。

我发现了一些不起作用的示例,因为该示例使用了一些NSPredicate(format: "%K == %@", #KeyPath(attribute), id)无法在 swift 中快速运行的“”代码。

所以我试图弄清楚我如何迅速解决这个问题。我不希望将 UUID 存储为简单的字符串,因为 coreData 允许我们保存 UUID 对象。

我有这种方法,但它在 NSPredicate 行上崩溃:

static func isKnownBikeID(_ bleID: UUID) -> Bool {
    let context = A18DataStore.shared.viewContext
    let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Bike")
    fetchRequest.predicate = NSPredicate(format: "%K == %@", [\Bike.bleID , bleID] as CVarArg)
    do{
        let bikes = try context.fetch(fetchRequest)
        return bikes.count > 0
    }
    catch let error as NSError {
        print("Could not fetch. \(error), \(error.userInfo)")
    }
    return false
}

编辑:我的当前方法出现异常:

2021-07-16 11:55:28.390629-0400 A18 UAT[9260:4171027] -[Swift.__SwiftDeferredNSArray rangeOfString:]: unrecognized selector sent to instance 0x282c22cc0

标签: swiftcore-datanspredicateuuid

解决方案


  • %K格式需要一个关键路径字符串,这可以使用#keyPath指令获得。
  • 该格式需要一个 Objective-C 对象,在这里我们可以使用和%@之间的免费桥接。UUIDNSUUID

这给出了:

let predicate = NSPredicate(format: "%K == %@",
                            #keyPath(Bike.bleID), bleID as NSUUID)

推荐阅读