在NSPredicate中解析UUID

时间:2018-09-19 07:25:45

标签: ios iphone swift realm

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

  

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

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

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

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

1 个答案:

答案 0 :(得分:3)

不要使用字符串插值来构建谓词格式,这是非常 难以获得正确的报价。例如,这可以工作(请注意其他 单引号):

downBorder

,但如果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.IdString

NSString

更好的是,使用let resultPredicateShoppingListDetail = NSPredicate(format: "Id == %@", shoppingListModel.Id) 键路径var arg替换和%K 编译器指令以插入正确的密钥路径:

#keyPath

有关谓词中的let resultPredicateShoppingListDetail = NSPredicate(format: "%K == %@", #keyPath(ShoppingList.Id), shoppingListModel.Id) %K的更多信息,请参见 《谓词编程指南》中的“Predicate Format String Syntax”