【问题标题】:Parsing UUID in NSPredicate在 NSPredicate 中解析 UUID
【发布时间】:2018-09-19 07:25:44
【问题描述】:

我正在尝试从 Realm 数据库中获取数据。我正在使用 NSPredicate。它运行良好。但是今天我必须从具有字符串 ID 的对象中获取数据。此 ID 在 UUID 中。因此,当我尝试使用 UUID(字符串 ID)获取值时,它会给我这样的错误

能够解析格式字符串“Id == BD1698EE-C57D-4B8D-9D54-1D4403B2136F”'

这是错误声明。而我在代码中有以下行。

let resultPredicateShoppingListDetail = NSPredicate(format: "Id == \(shoppingListModel.Id)")

这对我来说没有意义。为什么会这样?

【问题讨论】:

  • 它已经是 UUID

标签: ios iphone swift realm


【解决方案1】:

不要使用字符串插值来构建谓词格式,它是非常 很难得到正确的必要引用。例如,这会起作用(注意附加的 单引号):

let uuid = "BD1698EE-C57D-4B8D-9D54-1D4403B2136F"
print(NSPredicate(format: "id == '\(uuid)'"))
// id == "BD1698EE-C57D-4B8D-9D54-1D4403B2136F"

但如果 uuid 字符串包含单引号也会失败。

最好使用%@ var arg 替换字符串:

let uuid = "BD1698EE-C57D-4B8D-9D54-1D4403B2136F"
print(NSPredicate(format: "id == %@", uuid))
// id == "BD1698EE-C57D-4B8D-9D54-1D4403B2136F"

在您的情况下(假设 shoppingListModel.IdStringNSString):

let resultPredicateShoppingListDetail = NSPredicate(format: "Id == %@", shoppingListModel.Id)

更好的是,使用%K keypath var arg 替换和#keyPath 插入正确密钥路径的编译器指令:

let resultPredicateShoppingListDetail = NSPredicate(format: "%K == %@",
                 #keyPath(ShoppingList.Id), shoppingListModel.Id)

有关谓词中%K%@ 的更多信息,请参阅 “Predicate Format String Syntax” 在“谓词编程指南”中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多