我想通过我的自定义对象使用BETWEEN进行数字比较。我已完成字符串比较,但数字比较喊出错误,如下面的代码所示。
class CustomClass: NSObject {
var name : String?
var aWidth : CGFloat!
}
字符串比较有效
let predicate = NSPredicate(format: "SELF.name contains[c] %@","Sal")
然而
let predicate = NSPredicate(format: "SELF.aWidth > 0 AND SELF.aWidth < 50")
let predicate = NSPredicate(format: "SELF.aWidth < 50")
我知道这个完全错了。
let predicate = NSPredicate(format: "SELF.aWidth BETWEEN {%@, %@}", {minWidth, maxWidth})
原因:'[<test.CustomClass 0x7fe86274bfd0> valueForUndefinedKey:]:此类不是键值aWidth的键值编码兼容。
所有对这个错误的搜索都把我带到了故事板问题。
如何使用BETWEEN编写谓词?提前致谢
UPDATE
我也发现这个关于在swift中使用filter的例子很有用。但我仍然有问题。
class Person : NSObject {
var age : CGFloat?
init(age: CGFloat) {
self.age = age
}
}
过滤
let eventAttendees = [Person(age: 22), Person(age: 41), Person(age: 23), Person(age: 30)]
let filteredAttendees = eventAttendees.filter({
$0.age < 30
})
for person in filteredAttendees {
print(person.age!)
}
当我尝试使用相同的技术时,这次我得到了这个错误。
第一种方法
let array = self.testDictionary.allValues as Array
var filteredArray = array.filter( { (user: Person) -> Bool in
return $0.age < 30
})
匿名闭包参数不能在具有显式参数的闭包内使用
第二种方法
let array = self.testDictionary.allValues as Array
var filteredArray = array.filter( { (user: Person) -> Bool in
return true
})
无法将类型'(Person)' - > Bool的值转换为预期的参数类型'(Anyobject)' - > Bool
谢谢
首先更新Xcode以使用Swift 2。
假设你有一本字典[Int:CustomClass]
let testDictionary = [1: CustomClass(name: "Foo", aWidth: 1.0), 2: CustomClass(name: "Bar", aWidth: 25.0), 3: CustomClass(name: "Baz", aWidth: 75.0)]
获取值数组(编译器知道它包含CustomClass
实例)
let array = Array(testDictionary.values)
那么你可以使用filter
函数
let filteredArray = array.filter { $0.aWidth > 0.0 && $0.aWidth < 50.0 }
print(filteredArray)
通过添加构造函数来初始化来修改您的类
class CustomClass: NSObject {
var name : String?
var width : CGFloat = 0.0
// *** define constructor ***
init(name: String, width: CGFloat) {
self.name = name
self.width = width
}
}
// *** Declare Array ***
let arrObjects = NSMutableArray()
// *** create objects and add to array ***
let obj1 = CustomClass(name: "Scale", width: 200.0)
self.arrObjects.addObject(obj1)
let obj2 = CustomClass(name: "Pen", width: 40.0)
self.arrObjects.addObject(obj2)
print("1. Filter on String")
// *** 1. Filter on String ***
var predicate = NSPredicate(format: "SELF.name contains[c] %@","sca")
var filteredArray = self.arrObjects.filteredArrayUsingPredicate(predicate)
for object in filteredArray
{
let obj = object as! CustomClass
print("\(obj.name!) \(obj.width)")
}
print("2. Filter on CGFloat")
// *** 2. Filter on CGFloat ***
predicate = NSPredicate(format: "width > %f AND width < %f",0.0, 50.0)
filteredArray = self.arrObjects.filteredArrayUsingPredicate(predicate)
for object in filteredArray
{
let obj = object as! CustomClass
print("\(obj.name!) \(obj.width)")
}
print("3. Filter using BETWEEN")
// *** 3. Filter using BETWEEN ***
predicate = NSPredicate(format: "width BETWEEN {%f, %f}",0.0, 50.0)
filteredArray = self.arrObjects.filteredArrayUsingPredicate(predicate)
for object in filteredArray
{
let obj = object as! CustomClass
print("\(obj.name!) \(obj.width)")
}
要在数组中使用谓词与自定义对象一起使用,如下所示:对于swift 4+:
func checkIfJobIdContains(array:NSArray, job_id: String) -> Bool
{
let temp = array.filter({ (result) -> Bool in
let modelObj = result as! ModalMultipleJobRequestsPage
if modelObj.job_id == job_id
{
return true
}
else
{
return false
}
})
if temp.count != 0
{
return true
}
return false
}