Swift 如何在操作之间写入NSPredicate自定义对象(CGFloat var)

Swift 如何在操作之间写入NSPredicate自定义对象(CGFloat var),swift,nspredicate,Swift,Nspredicate,我想通过自定义对象使用之间的进行数字比较。 我已经做了字符串比较,但是数字比较会显示错误,如下代码所示 class CustomClass: NSObject { var name : String? var aWidth : CGFloat! } 字符串比较哪个有效 let predicate = NSPredicate(format: "SELF.name contains[c] %@","Sal") 然而 let predicate = NSPr

我想通过自定义对象使用之间的进行数字比较。 我已经做了字符串比较,但是数字比较会显示错误,如下代码所示

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")
原因:“[valueForUndefinedKey:]:该类不符合密钥aWidth的键值编码”

对这个错误的所有搜索都让我产生了故事板问题

如何使用BETWEEN编写谓词? 提前谢谢

更新

我还发现了关于在swift中使用过滤器的示例,该示例非常有用。但我还是有问题

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!)
                    }
无法将类型为“(Person)”->Bool的值转换为预期参数 键入“(任何对象)”->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 filteredArray = array.filter { $0.aWidth > 0.0 && $0.aWidth < 50.0 }
print(filteredArray)
让filteredArray=array.filter{$0.aWidth>0.0&&0.aWidth<50.0}
打印(过滤光线)

通过添加构造函数进行初始化来修改类

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)")
}
class自定义类:NSObject{
变量名称:字符串?
变量宽度:CGFloat=0.0
//***定义构造函数***
init(名称:String,宽度:CGFloat){
self.name=名称
自宽=宽度
}
}
//***声明数组***
设arobjects=NSMutableArray()
//***创建对象并添加到阵列***
设obj1=CustomClass(名称:“刻度”,宽度:200.0)
self.arobjects.addObject(obj1)
设obj2=CustomClass(名称:“笔”,宽度:40.0)
self.arobjects.addObject(obj2)
打印(“1.字符串上的过滤器”)
// *** 1. 按字符串筛选***
var谓词=NSPredicate(格式:“SELF.name包含[c]@”,“sca”)
var filteredArray=self.arobjects.filteredArray使用谓词(谓词)
对于filteredArray中的对象
{
设obj=对象为!CustomClass
打印(“\(对象名称!)\(对象宽度)”)
}
打印(“2.CGFloat上的过滤器”)
// *** 2. CGFloat上的过滤器***
谓词=NSPredicate(格式:“宽度>%f,宽度<%f”,0.0,50.0)
filteredArray=self.arobjects.filteredArray使用谓词(谓词)
对于filteredArray中的对象
{
设obj=对象为!CustomClass
打印(“\(对象名称!)\(对象宽度)”)
}
打印(“3.使用中间过滤器”)
// *** 3. 使用中间的过滤器***
谓词=NSPredicate(格式:“在{%f,%f}之间的宽度”,0.0,50.0)
filteredArray=self.arobjects.filteredArray使用谓词(谓词)
对于filteredArray中的对象
{
设obj=对象为!CustomClass
打印(“\(对象名称!)\(对象宽度)”)
}

引用自

对数组中的自定义对象使用谓词,对于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
}

这很有帮助,在swift中从未对数组使用过此新过滤器。简单快速。谢谢迪本,这也帮了我一些其他的案子。
let array = Array(testDictionary.values)
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)")
}
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
}