2015-12-29 11 views
16

dire che ho un molto semplice Person classeVerificando un array di oggetti personalizzati contiene un oggetto personalizzato specifica

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

e desidero conservare una collezione di tali Person s in una proprietà, che è una matrice con digitare una persona, di una classe Persone

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

forse raggiungere questo come segue

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

DOMANDA: come faccio a controllare se people.list contiene l'istanza alex, per favore?

mia semplice tentativo, che speravo di tornare true

people.list.contains(alex) 

chiama un errore "cannot convert value of type 'Person' to expected argument type '@noescape (Person) throws -> Bool'"

risposta

33

Ci sono due contains funzioni:

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 
} 

Il compilatore si lamenta perché il compilatore sa che Person non è Equatable e quindi contains deve avere un predicate ma alex non è un predicato.

Se le persone della tua serie sono Equatable (non lo sono) allora si potrebbe utilizzare:

person.list.contains(alex) 

Dal momento che non sono equatable, è possibile utilizzare la seconda funzione contains con:

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

o, come Martin R sottolinea, sulla base di 'identità' con:

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

o è possibile effettuare PersonEquatable (basato su name o identità).

+0

molte grazie - e @ Martin R : "theperson.list.contiene {$ 0 === alex} "ha funzionato un incantesimo :-) – Alex

+0

gentilmente aggiorna a swift 3 anche –

+0

nel caso qualcuno si stia chiedendo cosa significhi" $ 0 "-> https://stackoverflow.com/questions/27491620/what- does-0-represent-in-closures-in-swift –

16

DOMANDA: come faccio a controllare se people.list contiene l'istanza alex, per favore?

class Person è un tipo riferimento, e var alex è un riferimento alla memorizzazione degli oggetti. L'operatore identico a=== controlla se due costanti o variabili si riferiscono alla stessa istanza di una classe.

Pertanto, al fine di controllare se l'elenco contiene un caso specifico , utilizzare il metodo predicato-based, e confronta le istanze con ===:

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

Come possiamo ottenere l'indice in cui la condizione diventa vera? –

+2

@BhavinRamani: Usa indice (dove: {$ 0 === alex}) ' –

Problemi correlati