2014-12-01 6 views
5

Ho una superclasse che ha un'implementazione di base di un metodo (prepareForSegue:sender: nel mio caso), e voglio assicurarmi che qualsiasi sottoclasse che sovrascrive questo metodo chiama l'implementazione del super.C'è un modo per annotare un metodo rapido come richiede una chiamata all'implementazione della sua superclasse

class A { 
    func foo() { 
     // Some basic shared behavior 
    } 
} 

class B : A { 
    override func foo() { 
     // I want the compiler to yell at me if I forget super.foo() here 
    } 
} 

C'è un modo per utilizzare NS_REQUIRES_SUPER a Swift, o forse un modo di imitare questo comportamento utilizzando protocolli?

+1

La stessa domanda qui, non sembra che ci sia un tale modo. http://stackoverflow.com/questions/27210646/swift-equivalent-to-attributeobjc-requires-super – MatthewG

risposta

0

Ci potrebbe essere una soluzione a questo, che potrebbe funzionare:

class A { 
    private func foo() { println("A: Foo") } 

    final func bar() { 
     println("A: Bar") 
     foo() 
    } 
} 

class B : A { 
    override private func foo() { println("B: foo") } 
} 

var a = A() 
a.bar()  // "A: Bar\nA: Foo" 
println() 
var b = B() 
b.bar()  // "A: Bar\nB: Foo" 

Questo codice non consente l'override del metodo bar(), ma consente di override del metodo foo(). Il trucco è che l'utente deve chiamare il metodo bar() invece del metodo foo(), ma se lo fai, allora ti assicuri che il metodo della superclasse, cioè println("A: Bar"), viene sempre chiamato! :-)