2014-11-30 14 views
22

Esiste un equivalente Swift perSwift equivalente a __attribute ((objc_requires_super))?

__attribute((objc_requires_super)) 

che dà un avviso se un metodo non chiama è il metodo eccellente?

Fondamentalmente, voglio avvertire (o anche meglio, lanciare un errore del compilatore) se un metodo sovrascritto non chiama il suo metodo super.

+0

[inviare una segnalazione di bug/richiesta di funzionalità] (https://bugreport.apple.com) –

+3

Trovato questo su OpenRadar: [Attributo equivalente di NS_REQUIRES_SUPER] (http://openradar.appspot.com/17408107) –

risposta

9

No, non esiste Swift equivalente a __attribute((objc_requires_super)).

La funzione equivalente, Swift Attributes, non contiene tale attributo.

La sezione del Swift inheritance documentation in cui tale funzione sarebbe essere menzionato dice solo:

Quando si fornisce un metodo, una proprietà o di override pedice per una sottoclasse, a volte è utile usare l'esistente implementazione della superclasse come parte del tuo override.


Si noti che è possono prevenire l'override funzioni utilizzando final, così si potrebbe efficace compiere ciò che si desidera, fornendo metodi overridable vuote che sono chiamati dai metodi non overridable:

class AbstractStarship { 
    var tractorBeamOn = false 

    final func enableTractorBeam() { 
     tractorBeamOn = true 

     println("tractor beam successfully enabled") 

     tractorBeamDidEnable() 
    } 

    func tractorBeamDidEnable() { 
     // Empty default implementation 
    } 
} 

class FancyStarship : AbstractStarship { 
    var enableDiscoBall = false 

    override func tractorBeamDidEnable() { 
     super.tractorBeamDidEnable() // this line is irrelevant 

     enableDiscoBall = true 
    } 
} 

Le sottoclassi quindi sovrascrivono i metodi sovrascrivibili e non importa se hanno chiamato super o meno dall'attuazione della superclasse lo ione è vuoto.

Come note Bryan Chen nei commenti, questo si interrompe se la sottoclasse è sottoclasse.

Non posso dire se questo approccio è stilisticamente buono, ma è certamente possibile.

+2

come su 'MoreFancyStarship' che è sottoclasse di' FancyStarship'? il suo 'super.tractorBeamDidEnable' non è più il metodo vuoto –

+0

@BryanChen Giusto, non è certamente un sostituto perfetto, sia in termini di verbosità che per la ragione che hai menzionato. Se vuoi applicarlo, 'AbstractStarship' potrebbe avere qualche errore di runtime se la sua implementazione di' tractorBeamDidEnable() 'non viene chiamata prima che' enableTractorBeam() 'ritorni. Naturalmente, questa è anche una soluzione imperfetta perché lo sviluppatore non ha alcuna indicazione che questo è sbagliato fino all'esecuzione del codice, diversamente da 'objc_requires_super'. –