2017-11-22 2 views
1

Erzwingt der Objective-C-Compiler nicht, dass die Methodenparameter den Protokollen entsprechen müssen, wenn die Methode in einem anderen Protokoll deklariert wird? Ich habe einige Code, der wie folgt aussieht:Ist Protokollkonformität in Methodenparametern optional?

@protocol FooProtocol<NSObject> 

-(UIView <BarProtocol>*)barView; 

@end 

@protocol BarProtocol<NSObject> 

-(BOOL)foobar; 

@end 

@interface FooController : NSObject<FooProtocol> 

@end 

@implementation FooController { 
    UIView *_view; 
} 

-(UIView *)barView { 
    return _view; 
} 

@end 

Und der Compiler nicht wieder beschweren sich, dass barView in FooController kein UIView * konform BarProtocol.

+1

Wenn Sie stark tippen möchten, wechseln Sie zu Swift. Objective-C ist im Wesentlichen immer noch C. Eine Dekoration wurde hinzugefügt, um dem Compiler zu helfen, zu verstehen, was passieren soll, aber der Compiler würde Ihnen erlauben, einen 'NSString' von dieser Methode zurückzugeben, wenn Sie einen Cast verwenden. – Paulw11

+1

_ "Der Compiler beschwert sich nicht" _ Es gibt eine Warnung dafür. –

Antwort

1

In Objective C und Swift Methoden werden mit Namen aufgerufen (um die Dinge zu beschleunigen, wird nur der Hash von Selector Name verglichen, wenn keine Kollisionen auftreten). Der Rückgabetyp der Argumenttypen hat keinen Namen für den Auswirkungsselektor.

Dies bedeutet, dass wenn Sie einen anderen Typ von Methode zurückgeben, während der Laufzeit kein Problem auftritt, bis Sie eine ungültige Operation für das zurückgegebene Objekt ausführen (z. B. zurückgegebene Ansicht implementiert das erforderliche Protokoll nicht und Sie haben dies aufgerufen) Methode).

Clang erkennt dies als Warnung und nicht als Fehler, und es empfiehlt sich, solche Warnungen zu beheben. In der Tat -Wall Switch während der Kompilierung wird dringend empfohlen.

Beachten Sie, dass das Protokoll nicht explizit von einer Klasse implementiert werden muss. Es ist ausreichend, wenn die Klasse alle passenden Methoden hat und zur Laufzeit funktioniert.

Verwandte Themen