Frage

Ich habe ein Objekt (ein UIViewController), die nicht zu einem Protokoll entsprechen kann oder kann ich definiert haben.

Ich weiß, ich kann feststellen, ob das Objekt das Protokoll entspricht, dann die Methode sicher nennen:

if([self.myViewController conformsToProtocol:@protocol(MyProtocol)]) {
    [self.myViewController protocolMethod]; // <-- warning here
}

Allerdings zeigt XCode eine Warnung:

warning 'UIViewController' may not respond to '-protocolMethod'

Was ist der richtige Weg, um diese Warnung zu verhindern? Ich kann nicht scheinen self.myViewController als MyProtocol Klasse zu werfen.

War es hilfreich?

Lösung

Der richtige Weg, dies zu tun, ist zu tun:

if ([self.myViewController conformsToProtocol:@protocol(MyProtocol)])
{
        UIViewController <MyProtocol> *vc = (UIViewController <MyProtocol> *) self.myViewController;
        [vc protocolMethod];
}

Das UIViewController <MyProtocol> * Typ-cast übersetzt „vc wird ein UIViewController Objekt, das zu MyProtocol anpaßt“, wohingegen unter Verwendung von id <MyProtocol> übersetzt „vc ist ein Objekt einer unbekannten Klasse, mit MyProtocol entspricht.“

Auf diese Weise der Compiler Sie die richtige Typprüfung auf vc geben wird - der Compiler wird nur eine Warnung ausgeben, wenn eine Methode, die auf beiden UIViewController oder <MyProtocol> nicht deklariert wird genannt. id sollte nur in der Situation verwendet werden, wenn Sie nicht wissen, die Klasse / Typ des Objekts, das gegossen wird.

Andere Tipps

Sie können es so werfen:

if([self.myViewController conformsToProtocol:@protocol(MyProtocol)])
{
    id<MyProtocol> p = (id<MyProtocol>)self.myViewController;
    [p protocolMethod];
}

Dies warf mich ein wenig, auch. In Objective-C ist das Protokoll nicht der Typ selbst, so dass Sie id (oder eine andere Art, wie NSObject) zusammen mit dem Protokoll angeben müssen, die Sie wollen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top