2016-12-13 5 views
0

habe ich ein Array von Objekten:Finden Element in einem Array von Objekt

var fullMonthlyList = [SimulationMonthly]() 

Die Klasse hier:

class SimulationMonthly { 
    var monthlyMonthDuration: NSNumber = 0 
    var monthlyYearDuration: NSNumber = 0 
    var monthlyFullAmount: NSNumber = 0 
    var monthlyAmount: Int = 0 

    init(monthlyMonthDuration: NSNumber, monthlyYearDuration: NSNumber, monthlyFullAmount: NSNumber, monthlyAmount: Int){ 
     self.monthlyMonthDuration = monthlyMonthDuration 
     self.monthlyYearDuration = monthlyYearDuration 
     self.monthlyFullAmount = monthlyFullAmount 
     self.monthlyAmount = monthlyAmount 
    } 
} 

ich einfach anhängen um es zu füllen, jetzt will ich zum Beispiel finden Wenn sie ein existierender Wert sind, zum Beispiel monthlyAmount entspricht "194" durch Suche im Array, wie kann ich tun? Ich habe versucht Filter und enthält aber ich bekomme Fehler.

Was ich habe versucht:

if self.fullMonthlyList.filter({ $0.monthlyAmount == self.monthlyAmount.intValue }) { ... } 

Fehler:

Cannot invoke 'filter' with an argument list of type '((SimulationMonthly) throws -> Bool)'

+1

"Ich habe versucht Filter und enthält aber ich bekomme Fehler." Kannst du uns zeigen, was du getan hast und welchen Fehler hast du bekommen? – Eendje

+0

@Eendje für if self.fullMonthlyList.filter ({$ 0.monthlyAmount == self.monthlyAmount.intValue}) {Ich bekomme: Kann 'filter' nicht mit einer Argumentliste vom Typ '((SimulationMonthly) throws -> Bool) aufrufen' – Ben

Antwort

3

Sie tun können:

if let sim = fullMonthlyList.first(where: { $0.monthlyAmount == 194 }) { 
    // Do something with sim or print that the object exists... 
} 

Dies wird Ihnen das erste Element im Array, wo monthlyAmount equals 194.

Wenn Sie alle Elemente mit dieser Bedingung wollen, können Sie filter verwenden:

let result = fullMonthlyList.filter { $0.monthlyAmount == 194 } 

Wenn Sie das Objekt überhaupt nicht brauchen, aber Sie wollen nur wissen, ob ein solches vorhanden ist, dann würde contains genug sein:

+0

Ich empfehle, dass Sie die abschließende Closure-Syntax verwenden, obwohl ich den Wert von 'where:' für demonstrative Zwecke sehen kann – Alexander

1

Hier ist ein einfaches Spielplatz Beispiel für das Filtern von Objekten auf der Grundlage der Übereinstimmung einer Eigenschaft. Sie sollten es auf Ihre Situation erweitern können.

class Item { 
    var value: Int 

    init(_ val: Int) { 
     value = val 
    } 
} 

var items = [Item]() 
for setting in 0..<5 { 
    items.append(Item(setting)) 
} 

func select(_ with: Int) -> [Item] { 
    return items.filter { $0.value == with } 
} 

let found = select(3) 
+0

Ich würde empfehlen, eine triviale Funktion wie 'select()' in Ihrem Beispiel zu schreiben. Es abstrahiert nicht viel, fügt aber dennoch eine unnötige Abstraktionsebene hinzu. – Alexander

+1

Rollback. (Wenn Sie eine Antwort so bearbeiten, dass sie Ihrem Codierungsstil entspricht, ändern Sie sie zumindest in etwas, das kompiliert wird.) –

+0

Whoops, das hätte sein sollen (0 .. <5) .map (Item.init) – Alexander

Verwandte Themen