2016-05-17 13 views
6

Ho due opzioni in sede di attuazione conformità del protocollo a Swift, con lo stesso risultato finale:Dove implementare i protocolli Swift?

  • implementare il protocollo all'interno della classe - vale a dire, lo stato di conformità in cima alla definizione di classe, e mettere implementazione all'interno del corpo della classe, oppure
  • Implementare il protocollo in un'estensione - ovvero, codificare la conformità del protocollo completamente al di fuori della classe.

Ecco un esempio:

public class MyClass : CustomDebugStringConvertible { 
    ... // Something 
    public var debugDescription : String { 
     return "MyClass" 
    } 
} 

vs.

class MyClass { 
    ... // Something 
} 
extension MyClass : CustomDebugStringConvertible { 
    public var debugDescription: String { 
     return "MyClass" 
    } 
} 

esempi di codice di libri Swift tendono a concentrarsi sul primo approccio; Apple's source code of Swift core rivela che usano solo il secondo approccio (vedere Bool e Optional per un esempio).

C'è un modo valido per decidere tra i due approcci a seconda della situazione o è semplicemente una questione di preferenza di codifica?

+2

È puramente una questione di preferenza, ed è quindi una questione di opinione. Personalmente faccio quasi sempre il secondo, ma non assolutamente sempre. Vedi anche i miei commenti sulle estensioni qui: http://www.apeth.com/swiftBook/ch04.html#_extending_object_types – matt

risposta

4

È più una questione di preferenza di codifica e leggibilità. Se pensi che la tua classe sarà gigante, potrebbe essere più sensato implementarla in un'estensione in modo che i suoi metodi non aggiungano confusione alla tua classe. Se è una classe breve, direi tutto in uno, perché la leggibilità è meno colpita.

4

Lo vedo principalmente come preferenza di codifica. Nella mia squadra qui abbiamo iniziato ad adottare il secondo approccio. All'inizio ho pensato che fosse un uso strano dell'estensione, ma sono arrivato ad apprezzarlo. Mantiene insieme i metodi implementati di un protocollo e dà l'impressione che la classe stessa sia più piccola (solo l'ottica in realtà). Potrei vedere alcune complicazioni o opportunità di confusione se, per esempio, la classe ha una vista tabella e si utilizzano le estensioni per implementare l'origine dati e delegare. Se qualcuno quindi sottoclassa quella classe, potrebbe non essere a conoscenza dell'estensione e vedere un comportamento imprevisto.