Swift:如何创建具有 Int 值的谓词?
Posted
技术标签:
【中文标题】Swift:如何创建具有 Int 值的谓词?【英文标题】:Swift: How do I create a predicate with an Int value? 【发布时间】:2015-08-07 19:00:03 【问题描述】:我在此语句中收到 EXC-BAD-ACCESS 错误:
var thisPredicate = NSPredicate(format: "(sectionNumber == %@"), thisSection)
thisSection 的 Int 值为 1,当我将鼠标悬停在它上面时显示值 1。但是在调试区域我看到了这个:
thisPredicate = (_ContiguousArrayStorage ...)
另一个使用字符串的谓词显示为 ObjectiveC.NSObject 为什么会这样?
【问题讨论】:
你有一个额外的左括号,不应该在那里 我不知道为什么它会在上面显示一个额外的括号,因为那不是我所拥有的 - 这是: var thisPredicate = NSPredicate(format: "(sectionNumber == %@)",thisSection) @PatriciaW 你的问题是你错过了 @ 之后的闭括号。顺便说一句,我已经编辑了我之前的答案,也许你应该看看我添加的一些注意事项。 雨果,我在上面的评论中更正了我的代码,但我没有编辑它......我现在会这样做。 【参考方案1】:您需要将%@
更改为%i
并删除多余的括号:
这里的主要问题是您将Int
放置在期望String
的位置。
这是一个基于post的示例:
class Person: NSObject
let firstName: String
let lastName: String
let age: Int
init(firstName: String, lastName: String, age: Int)
self.firstName = firstName
self.lastName = lastName
self.age = age
override var description: String
return "\(firstName) \(lastName)"
let alice = Person(firstName: "Alice", lastName: "Smith", age: 24)
let bob = Person(firstName: "Bob", lastName: "Jones", age: 27)
let charlie = Person(firstName: "Charlie", lastName: "Smith", age: 33)
let quentin = Person(firstName: "Quentin", lastName: "Alberts", age: 31)
let people = [alice, bob, charlie, quentin]
let thisSection = 33
let thisPredicate = NSPredicate(format: "age == %i", thisSection)
let _people = (people as NSArray).filteredArrayUsingPredicate(thisPredicate)
_people
另一种解决方法是将thisSection
的值设为String
,这可以通过字符串插值 或通过description
的description
属性来实现@ .. 假设:
变化:
let thisPredicate = NSPredicate(format: "age == %i", thisSection)
为
let thisPredicate = NSPredicate(format: "age == %@", thisSection.description)
或
let thisPredicate = NSPredicate(format: "age == %@", "\(thisSection)")
当然,你总是可以绕过这一步,选择更硬编码(但也是正确的)的东西:
let thisPredicate = NSPredicate(format: "sectionNumber == \(thisSection)")
但是考虑到一些奇怪的原因 字符串插值(这种结构:
"\(thisSection)"
)导致保持循环,如here所述
【讨论】:
雨果,感谢您的这些建议。我尝试了 %@,但不知道使用 .description。我尝试了 %d 但没有尝试 %i。.description
是 Swift 中每种数据类型的属性,它将Number
、Date
等的值转换为String
表示形式。 %i
为您进行此转换。
花两天时间弄清楚为什么我的带有谓词的 fetchedresultcontroller 不起作用,解决方案是将 %@
替换为 %i
。数据类型很重要,我们需要确保我们使用正确的类型进行过滤!!!
如果值是 int64 这将不起作用%我将转换将其视为 int32,如果值高于 2,147,483,648 它将溢出。【参考方案2】:
当您的数据安全或经过清理后,您可以尝试字符串插值Swift Standard Library Reference。看起来像这样:
let thisSection = 1
let thisPredicate = NSPredicate(format: "sectionNumber == \(thisSection)")
【讨论】:
请不要在创建谓词时使用字符串插值。这个答案:***.com/a/31885149/543844,由 Hugo Alonso 提供,应该被选为正确答案。【参考方案3】:在 64 位架构上,Int
映射到 Int64
,如果其值大于 2,147,483,648,%i 将溢出。
您需要将 %@ 更改为 %ld 并删除多余的括号。
【讨论】:
那我们应该用什么??以上是关于Swift:如何创建具有 Int 值的谓词?的主要内容,如果未能解决你的问题,请参考以下文章
iPhone NSPredicate 如何创建一个检查属性是不是有值的谓词?
NSPredicate'运算符'LIKE'不支持int类型'