2017-06-11 4 views
0
class Person: Equatable { 
var name: String 
var age: Int 

init(name: String, age: Int) { 
    self.name = name 
    self.age = age 
} 
static func ==(lhs: Person, rhs: Person) -> Bool { 
    return (lhs.name == rhs.name) && (lhs.age == rhs.age) 
} 
} 
let p1 = Person(name: "David", age: 29) 
let p2 = Person (name: "John", age: 28) 

var people = [Person]() 
people.append(p1) 
people.append(p2) 

let p1index = people.index(of: p1) 
let p2index = people.index(of: p2) 

Pour utiliser index(of:), je dois me conformer au protocole Equatable. D'après ce que je sais, le protocole Equatable permet de comparer 2 instances pour l'égalité. Quelle est la relation entre trouver un index et comparer pour l'égalité? Pourquoi je dois me conformer au protocole Equatable afin d'utiliser index(of:)?Index (de :) et protocole équivalent

Pour adopter le protocole assimilables, je dois mettre en œuvre l'opérateur (==) comme méthode statique:

static func ==(lhs: Person, rhs: Person) -> Bool { 
    return (lhs.name == rhs.name) && (lhs.age == rhs.age) 
} 

Je ne compare pas les instances de personne pour l'égalité ici, pourquoi dois-je encore return (lhs.name == rhs.name) && (lhs.age == rhs.age)? Pourquoi est-ce? Est-ce que cela a quelque chose à voir avec index(of:)?

Désolé de poser cette question stupide.

+1

Est-ce que [l'implémentation de 'index (de:)'] (https://github.com/apple/swift/blob/master/stdlib/public/core/CollectionAlgorithms.swift.gyb#L64) répond à votre question ? :) – Hamish

+1

Bien que je ne sois pas sûr de comprendre la deuxième partie de votre question, "* Je ne compare aucune instance de personne pour l'égalité ici" - oui vous l'êtes, vous comparez les propriétés de 'lhs' avec' rhs les propriétés de '. – Hamish

+0

Ça aide. Merci beaucoup :) – Frankie

Répondre

1

Demandez-vous ceci: que fait exactement index(of:)?

Il trouve l'index de l'élément spécifié dans le tableau. Droite? En d'autres termes, il trouve l'indice du premier élément qui est égal au paramètre.

Une implémentation simple pour index(of:) consisterait à effectuer une boucle dans la matrice et, à chaque itération, vérifier si l'élément est égal au paramètre. Si c'est le cas, retournez l'index. Comme vous pouvez le voir, cela implique de vérifier si deux objets sont égaux, donc le protocole Equatable est requis.

+0

Maintenant, je comprends. Merci beaucoup :) – Frankie

1

indexOf (:) dans ce cas, requis pour confirmer le protocole Equitable.

REMARQUE:

  • Comme indexOf (:) tableau itérer et comparer votre objet passé à chaque élément du tableau qui comparant indirectement et en retournant l'index de l'objet adapté.

Pour exemple:

let p1index = people.index(of: p1) 

Ici, p1index peut trouver en la comparant à chaque élément du tableau de personnes et le retour de l'indice en comparant les propriétés de l'objet p1 match de avec propriétés de l'objet dans le tableau de personnes à cet index particulier.