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) 

Um index(of:) zu verwenden, muss ich Person zu Equatable-Protokoll anpassen. Soweit ich weiß, ermöglicht das Equatable-Protokoll den Vergleich zweier Instanzen für die Gleichheit. Was ist die Beziehung zwischen dem Finden eines Indexes und dem Vergleich für Gleichheit? Warum muss ich Equatable-Protokoll entsprechen, um index(of:) zu verwenden?Index (von :) und Equatable Protokoll

das Protokoll zu verabschieden gleichzusetzen, muss ich den (==) Operator als statische Methode implementieren:

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

ich keine Person Instanzen für die Gleichstellung hier bin im Vergleich, warum muss ich immer noch zu return (lhs.name == rhs.name) && (lhs.age == rhs.age)? Wofür ist das? Hat es etwas mit index(of:) zu tun?

Entschuldigung für diese blöde Frage.

+1

Beantwortet [die Implementierung von 'index (of:)'] (https://github.com/apple/swift/blob/master/stdlib/public/core/CollectionAlgorithms.swift.gyb#L64) Ihre Frage ? :) – Hamish

+1

Obwohl ich nicht sicher bin, verstehe ich den zweiten Teil Ihrer Frage, "* Ich vergleiche keine Person Instanzen für Gleichheit hier *" - ja, Sie sind, vergleichen Sie 'lhs' Eigenschaften mit' rhs 's Eigenschaften. – Hamish

+0

Es hilft. Vielen Dank :) – Frankie

Antwort

1

Fragen Sie sich: Was macht index(of:) genau?

Es findet den Index des angegebenen Elements im Array. Recht? Mit anderen Worten, findet es den Index des ersten Elements, der gleich dem Parameter ist.

Eine einfache Implementierung für index(of:) wäre, das Array zu durchlaufen und in jeder Iteration zu prüfen, ob das Element dem Parameter entspricht. Wenn dies der Fall ist, geben Sie den Index zurück. Wie Sie sehen können, wird dabei überprüft, ob zwei Objekte gleich sind. Daher ist das Protokoll Equatable erforderlich.

+0

Jetzt verstehe ich. Vielen Dank :) – Frankie

1

indexOf (:) in diesem Fall erforderlich gleichzusetzen Protokoll zu bestätigen.

HINWEIS:

  • Als indexOf (:) Iterierte Array und vergleichen Ihre gebenen Objekts zu jedem Element in dem Array, die indirekt zu vergleichen, und den Index des angepassten Objekts zurück.

Für zB:

let p1index = people.index(of: p1) 

Hier p1index durch einen Vergleich mit jedem Element im Menschen Array und gibt den Index durch den Vergleich Eigenschaften von p1 Objekt finden Spiel mit Eigenschaften der Objekt im People-Array bei diesem bestimmten Index.

Verwandte Themen