2016-06-07 4 views
0

ich tun möchte, Nummer Vergleich mit ZWISCHEN durch mein benutzerdefiniertes Objekt schreiben. Ich habe String-Vergleich gemacht, aber Nummer Vergleich schreit Fehler wie im folgenden Code.Wie NSPredicate benutzerdefiniertes Objekt (CGFloat var) zwischen dem Betrieb

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

String Vergleich die

let predicate = NSPredicate(format: "SELF.aWidth > 0 AND SELF.aWidth < 50") 

let predicate = NSPredicate(format: "SELF.aWidth < 50") 

Dieses totaly falsch

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

JEDOCH funktioniert weiß ich.

let predicate = NSPredicate(format: "SELF.aWidth BETWEEN {%@, %@}", {minWidth, maxWidth}) 

Grund: '[< test.CustomClass 0x7fe86274bfd0> valueForUndefinedKey:.]: Diese Klasse nicht Schlüsselwert ist Codierung-konform für den Schlüssel aWidth'

Alle Suche nach diesem Fehler hat mich Storyboard Fragen.

Wie kann ich ein Prädikat mit BETWEEN schreiben? Vielen Dank im Voraus

UPDATE

Ich fand auch dieses Beispiel über Filter in schnellen verwendet, die hilfreich ist. Aber ich habe immer noch das Problem.

class Person : NSObject { 

    var age : CGFloat? 

    init(age: CGFloat) { 
     self.age = age 
    } 
} 

Filter

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

Wenn ich versuche, gleiche Technik zu verwenden, erhalte ich diese Fehler diesmal.

Erster Ansatz

let array = self.testDictionary.allValues as Array 

var filteredArray = array.filter({ (user: Person) -> Bool in 

        return $0.age < 30 
       }) 

Anonymous Schließung Argumente können nicht innerhalb eines Verschlusses verwendet werden, die explizite Argumente

Zweiter Ansatz

let array = self.testDictionary.allValues as Array 

var filteredArray = array.filter({ (user: Person) -> Bool in 

         return true 
        }) 
hat

Wert kann nicht vom Typ umwandeln '(Person)' -> Bool zu erwarten Argument Typ '(ANYOBJECT)' -> Bool

Dank

Antwort

0

Zunächst einmal Update Xcode verwenden Swift 2.

Vorausgesetzt, dass Sie ein Wörterbuch haben [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)] 

den Wert Array erhalten (der Compiler weiß, dass es CustomClass Instanzen enthält)

let array = Array(testDictionary.values) 

dann können Sie die filter Funktion

let filteredArray = array.filter { $0.aWidth > 0.0 && $0.aWidth < 50.0 } 
print(filteredArray) 
verwenden
+0

Dies ist hilfreich, nie benutzt diese neue Filter für Array in Swift. einfach und schnell. – selcuk

0

Ändern Sie Ihre Klasse b y Constructor Zugabe

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

von NSHipster blog by Mattt Thompson

+0

Danke Dipen, das hilft mir auch in anderen Fällen. – selcuk

-1

referenzierte zu initialisieren Prädikate Zur Verwendung mit benutzerdefinierten Objekten in Array wie unten verwenden, für eine schnelle 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 
}