2016-06-07 31 views
0

我想通過我的自定義對象做數比較使用BETWEEN 我已經完成了字符串比較,但是數字比較發出錯誤,如下面的代碼所示。如何寫NSPredicate自定義對象(CGFloat的VAR)之間的合作

其中工程

let predicate = NSPredicate(format: "SELF.name contains[c] %@","Sal") 

class CustomClass: NSObject { 
    var name  : String? 
    var aWidth  : CGFloat! 
} 

字符串比較無論其

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

我也發現有關在迅速濾波器是有幫助的這個例子。但我仍然有這個問題。

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 
        }) 
封閉的內部使用

無法將類型的價值 '(人)' - >布爾預期參數 型 '(Anyobject)' - >布爾

感謝

回答

0

首先更新的Xcode使用斯威夫特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) 
+0

這是有幫助的,從來沒有使用過這種新快速篩選數組。方便快捷。 – selcuk

0

修改你的班級b Ÿ加入構造函數初始化

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)") 
} 

NSHipster blog by Mattt Thompson

+0

謝謝迪彭,這也幫助我解決了其他一些問題。 – selcuk

-1

參考陣列中使用自定義對象使用謂詞使用如下,爲迅速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 
}