Xcode 9.3 - NSPredicate Bool 崩溃

Posted

技术标签:

【中文标题】Xcode 9.3 - NSPredicate Bool 崩溃【英文标题】:Xcode 9.3 - NSPredicate Bool crash 【发布时间】:2018-05-17 10:24:50 【问题描述】:

Xcode 9.3 更新后,我注意到如果你想拥有这样的 Predicate:

let predicate = NSPredicate(format: "preferred = %@", true as CVarArg)

你遇到了崩溃。但在 Xcode 9.2 中,这不是问题。有什么想法吗?

【问题讨论】:

看来不是关于 Xcode,而是关于 Swift 更新(Xcode 9.3 包括 Swift 4.1) 【参考方案1】:

// 解决方案3 [Apple Documentation]

let predicate = NSPredicate(format: "preferred == TRUE")

出现异常是因为true 不是对象 (%@)。您需要%d 占位符

let predicate = NSPredicate(format: "preferred = %d", true)

【讨论】:

【参考方案2】:

我觉得你也可以用这个:

NSPredicate(format: "preferred = true")

【讨论】:

是的,这也是一个解决方案!我也注意到了这一点。基本上,最好避免像我一开始那样将 swift boolean 作为 CVarArg 传递。不明白为什么,但没关系。【参考方案3】:

经过一番调查,我发现了如何解决这个问题。简而言之:

// Solution 1 [ NSNumber ]
let bool = NSNumber(booleanLiteral: true)
let predicate = NSPredicate(format: "preferred = %@", bool as CVarArg)

// Solution 2 [ Bool ] (static example)
let predicate = NSPredicate(format: "preferred == YES")

正如here 所解释的,当我们必须处理这种方法时,处理 Obj-C 类型而不是 Swift 类型会更好。

【讨论】:

NSPredicate(format: "preferred = %@", true as NSNumber) 是另一种选择。

以上是关于Xcode 9.3 - NSPredicate Bool 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 9.3 中的状态栏渲染警告

Xcode 9.3 突然不解析情节提要

xcode 9.3 中的 Json 数据

Xcode 9.3 编译 Swift 源项目永远不会完成

Xcode 9.3 无法查看实时设备日志

如何在 XCode 9.3 上收集覆盖率数据?