在NSPredicate中解析UUID

And*_*eem 2 iphone realm ios swift

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

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

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

let resultPredicateShoppingListDetail = NSPredicate(format: "Id == \(shoppingListModel.Id)")
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*n R 5

不要使用字符串插值来构建一个谓语形式,这是非常 难以得到必要的引用正确。例如,这可以工作(请注意附加的单引号):

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

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

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

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

在您的情况下(假设shoppingListModel.Id是a StringNSString):

let resultPredicateShoppingListDetail = NSPredicate(format: "Id == %@", shoppingListModel.Id)
Run Code Online (Sandbox Code Playgroud)

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

let resultPredicateShoppingListDetail = NSPredicate(format: "%K == %@",
                 #keyPath(ShoppingList.Id), shoppingListModel.Id)
Run Code Online (Sandbox Code Playgroud)

有关谓词%K及其%@谓语的更多信息,请参见 “谓词编程指南中的“谓词格式字符串语法”