2015-06-18 27 views
5

Mam objc klasę bazową:Rozszerzanie delegata z klasy bazowej

@protocol BaseClassDelegate; 

@interface BaseClass : NSObject 

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

@end 

@protocol BaseClassDelegate <NSObject> 

-(void)baseDelegateMethod; 

@end 

tworzę szybkiego sub-klasy, w którym chcę przedłużyć delegata ...

protocol SubClassDelegate : BaseClassDelegate { 

    func additionalSubClassDelegateMethod(); 
} 

class SubClass: BaseClass { 

    @IBAction func onDoSomething(sender: AnyObject) { 

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

Teraz, kiedy tworzę swoją podklasę, mogę powiedzieć, że jest zgodna z SubClassDelegate i ustawić delegata. Problem polega (oczywiście) na tym, że "delegat" nie istnieje w tej pod-klasie. Czy istnieje sposób, aby powiedzieć kompilatorowi, aby "rozszerzyć" mojego delegata na moją pod-klasę? (lub jestem tutaj obłąkany i nie zauważyłem czegoś oczywistego)

Odpowiedz

8

Chciałbym utworzyć delegata opakowania, aby stał się poprawnym typem w SubClass.

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

Albo po prostu rzucić delegata do oczekiwanego typu:

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

Dzięki. Druga opcja działała, chociaż pierwsza opcja wyglądała na bardziej delegowaną, ale spowodowała błędy kompilatora w.r.t. przesłanianie właściwości i typu. – Fittoburst

+1

Tak, przepraszam, nie można przesłonić właściwości, aby była bardziej szczegółowa niż klasa nadrzędna. Zaktualizowałem pierwszą próbkę. – redent84

4

Oto pełniejsza przykładem, jak to zrobić. Dzięki redent84 za wskazanie mnie we właściwym kierunku.

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() 
     } 
    } 
} 

A potem w swojej realizacji:

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

    func subclassDelegateMethod() { 
     // yay! 
    } 
}