2015-06-18 12 views
5

Ho una classe base objc:Estensione di un delegato da una classe base

@protocol BaseClassDelegate; 

@interface BaseClass : NSObject 

@property (nonatomic, weak) id <BaseClassDelegate> delegate; 

@end 

@protocol BaseClassDelegate <NSObject> 

-(void)baseDelegateMethod; 

@end 

sto creando un rapido sottoclasse in cui voglio estendere il mio delegato ...

protocol SubClassDelegate : BaseClassDelegate { 

    func additionalSubClassDelegateMethod(); 
} 

class SubClass: BaseClass { 

    @IBAction func onDoSomething(sender: AnyObject) { 

     delegate?.additionalSubClassDelegateMethod(); <--- No such method in 'delegate' 
    } 
} 

Ora, quando creo la mia sottoclasse, posso dire che è conforme a SubClassDelegate e impostare il delegato. Il problema è (ovviamente), è che "delegato" non esiste in questa sottoclasse. C'è un modo per dire al compilatore di 'estendere' il mio delegato nella mia sottoclasse? (o sono pazzo qui e ho perso qualcosa di ovvio)

risposta

8

Avrei creato un delegato del wrapper per renderlo il tipo corretto in SubClass.

class SubClass: BaseClass { 
    var myDelegate: SubClassDelegate? { 
     get { return delegate as? SubClassDelegate } 
     set { delegate = newValue } 
    } 
    @IBAction func onDoSomething(sender: AnyObject) { 
     myDelegate?.additionalSubClassDelegateMethod(); 
    } 
} 

O semplicemente gettato il delegato al tipo previsto:

(delegate as? SubClassDelegate)?.additionalSubClassDelegateMethod(); 
+0

Grazie. La seconda opzione funzionava anche se la prima opzione sembrava più delegata, ma produceva errori del compilatore w.r.t. ignorando la proprietà e il tipo. – Fittoburst

+1

Sì, mi dispiace, non è possibile sovrascrivere una proprietà per renderla più specifica della classe genitore. Ho aggiornato il primo campione. – redent84

4

Ecco un esempio più completa di come fare questo. Grazie a redent84 per avermi indicato nella giusta direzione.

protocol SubclassDelegate: ClassDelegate { 
    func subclassDelegateMethod() 
} 

class Subclass: Class { 
    // here we assume that super.delegate property exists 
    @IBAction func buttonPressedOrSomeOtherTrigger() { 
     if let delegate: SubclassDelegate = self.delegate as? SubclassDelegate { 
      delegate.subclassDelegateMethod() 
     } 
    } 
} 

E poi nell'implementazione:

extension SomeOtherClass: SubclassDelegate { 
    let someObject = Subclass() 
    someObject.delegate = self 

    func subclassDelegateMethod() { 
     // yay! 
    } 
} 
Problemi correlati