2017-02-01 2 views
0

Ich entschuldige mich im Voraus für eine solche dumme Frage, aber ich habe nicht ganz bekommen, was ich von den anderen Antworten da draußen wissen wollte. Hier ist der Beispielcode von benutzerdefinierten Delegaten Protokoll aus dem Ray Wenderlich iOS natürlichNicht vollständig das Konzept der benutzerdefinierten Protokolle, Swift 3

protocol AddItemViewControllerDelegate: class { 
func addItemViewControllerDidCancel(_ controller: AddItemViewController) 
func addItemViewController(_ controller: AddItemViewController, 
didFinishAdding item: ChecklistItem) } 

Obwohl die Definition des Protokolls ganz klar ist, ist es eine Art Vertrag, der verwendet wird, um zu angepasst werden soll. Aber hier ist die Implementierung der Funktion des Protokolls in dem Körper der Conforming Klasse

func addItemViewController(_ controller: AddItemViewController, 
          didFinishAdding item: ChecklistItem) { 
    let newRowIndex = items.count 
    items.append(item) 
    let indexPath = IndexPath(row: newRowIndex, section: 0) 
    let indexPaths = [indexPath] 
    tableView.insertRows(at: indexPaths, with: .automatic) 
    dismiss(animated: true, completion: nil) 
} 

Und es gibt keine tatsächliche Nutzung von Controller Argumente, und was didFinishAdding? Soweit ich verstehe, ist didFinishAdding nur ein externer Name für das interne Argument Element. Aber wie es funktioniert, wie es aus dem Körper des Protokolls verstehen könnte, dass der Controller AddItemViewController sendet ChecklistItem an den entsprechenden Delegaten, oder ist es ein vordefinierter Funktionstyp?

+1

Woher haben Sie diesen Code? Gibt es ein bestimmtes Tutorial von Ray, für das Sie eine URL angeben können? –

Antwort

0

Hier sprechen wir über Swift-Code-Stil-Konvention.

Die didFinishAdding ist eine Argumentbeschreibung, die dem Anrufer verdeutlicht, was er sein soll. Natürlich sehen Sie, dass der Typ des zweiten Arguments ChecklistItem ist, aber damit Entwickler nicht verwirrt werden, machen Sie diese kurze Erklärung, welches Element genau an die Funktion übergeben werden sollte.

In Ihrem Beispiel controller Argument wird nicht verwendet, denke ich, weil es in dieser bestimmten Implementierung nicht notwendig ist. Das ist jedoch der allgemeine Stil der Delegierten: Sie sagen wer tat die Aktion und was ist der Gegenstand davon. Es gibt möglicherweise einen Fall, in dem Sie wissen müssen, was AddItemViewController einen Artikel hinzugefügt hat.

0

didFinishAdding ist nur ein Hilfsmittel zum besseren Verständnis der Signatur der Funktion.

In Ihrem Beispiel wird "Controller" nicht verwendet, aber es ist nur in diesem Fall. wenn eine Eigenschaft in der Signatur ist, sind Sie nicht gezwungen, sie zu benutzen :)

Verwandte Themen