2015-12-29 2 views
16

sagen, ich habe eine sehr einfache Person Klasseprüft eine Reihe von benutzerdefinierten Objekte enthalten eine bestimmte benutzerdefinierte Objekt

class Person { 
    var name:String 
    init(name:String) { 
     self.name = name 
    } 
} 

und ich möchte meinen Sammlungen speichern solcher Person s in einer Eigenschaft, die mit ein Array ist Typ Person, eines Menschen Klasse

class People { 
    var list:[Person] = [] 
} 

vielleicht erreiche ich dies als

var alex = Person(name:"Alex") 
var people = People() 
people.list.append(alex) 
folgt

FRAGE: Wie kann ich überprüfen, ob people.list die Instanz alex enthält, bitte?

meine einfache Versuch, die ich hatte gehofft, zurückzukehren true

people.list.contains(alex) 

ruft einen Fehler "cannot convert value of type 'Person' to expected argument type '@noescape (Person) throws -> Bool'"

Antwort

33

Es gibt zwei contains Funktionen:

extension SequenceType where Generator.Element : Equatable { 
    /// Return `true` iff `element` is in `self`. 
    @warn_unused_result 
    public func contains(element: Self.Generator.Element) -> Bool 
} 

extension SequenceType { 
    /// Return `true` iff an element in `self` satisfies `predicate`. 
    @warn_unused_result 
    public func contains(@noescape predicate: (Self.Generator.Element) throws -> Bool) rethrows -> Bool 
} 

Der Compiler, weil der Compiler beschwert sich weiß, dass Person nicht Equatable ist und somit contains muss eine predicate haben aber alex ist kein Prädikat.

Wenn die Leute in Ihrem Array sind Equatable (sie sind nicht), dann könnten Sie:

person.list.contains(alex) 

Da sie nicht gleichzusetzen sind, können Sie die zweite contains Funktion mit verwenden:

person.list.contains { $0.name == alex.name } 

oder, wie Martin R weist darauf hin, basierend auf 'Identität' mit:

person.list.contains { $0 === alex } 

oder Sie könnten PersonEquatable machen sein (basierend auf entweder name oder Identität).

+0

vielen Dank - und R @ Martin : "dieperson.liste.enthält {$ 0 === alex} "hat einen charm gemacht :-) – Alex

+0

freundlicherweise update auf swift 3 auch –

+0

falls jemand sich fragt, wofür" $ 0 "steht -> https://stackoverflow.com/questions/27491620/what- does-0-represent-in-closures-in-swift –

16

FRAGE: Wie kann ich überprüfen, ob people.list die Instanz alex enthält, bitte?

class Person ist ein Referenztyp und var alex ist eine Referenz auf das Objekt Lagerung. Die identisch zu Betreiber === prüft, ob zwei Konstanten oder Variablen beziehen sich auf die gleiche Instanz einer Klasse.

um daher zu prüfen, ob die Liste eine spezifische Instanz enthält, verwenden das Prädikat basierte Methode und vergleichen Instanzen mit ===:

if people.list.contains({ $0 === alex }) { 
    // ... 
} 
+0

Wie können wir Index bekommen, wo Bedingung wahr wird? –

+2

@BhavinRamani: Verwenden Sie 'Index (wo: {$ 0 === alex})' ' –

Verwandte Themen