2009-08-20 3 views
3

In Ordnung, ich habe zwei Protokolle in der gleichen Header-Datei, nennen wir sie Protocol1 und Protocol2. Ich habe einen Haupt-App-Controller, die beiden Protokolle entsprechen, und eine NSWindowController Unterklasse, die das folgende Mitglied hat:Die Typ-ID <Protocol1> stimmt nicht mit der ID <Protocol2> überein - tut es aber!

id <Protocol1, Protocol2> delegate; 

Ich bin am Ende meiner NSWindowController Unterklasse Implementierung eine Warnung bekommen, dass „Typ-ID nicht übereinstimmt zu Protokoll2 ". Aber wie gezeigt, muss der Delegat mit beiden Protokollen übereinstimmen, was er tut.

Darüber hinaus funktioniert die Anwendung perfekt. Gibt es einen anderen Weg, dies zu tun? Ich nehme an, ich könnte einfach die beiden Protokolle zusammenlegen, aber das würde die Modularität des Programms beeinträchtigen.

EDIT:

Hier sind die beiden Protokolle. Da dies eher ein Testszenario ist, sind sie kurz.

+0

Können Sie bitte die beiden Protokolldeklarationen zeigen? – bbum

+0

Sicher, überprüfe meine bearbeitete Frage. Sie sind in der gleichen Datei. – Cinder6

Antwort

3

Die Sprachspezifikation ist nicht eindeutig, wenn die ID-mit-Protokolle tatsächlich eine Protokollliste unterstützt oder nicht. Protokolle können Protokolllisten erweitern, aber es ist nicht klar, ob diese Syntax dies unterstützt oder nicht.

Sie könnten ein kombiniertes Protokoll erstellen:

@protocol AddPowerAndTPTBController <AddPower, TPTBController> 
@end 
... 
id <AddPowerAndTPTBController> delegate; 

Auch wenn es nicht elegant, würde es funktionieren; aber es würde erfordern, dass Ihre Delegate-Klasse auch dem AddPoewrAndTPTBController entspricht, nicht nur die beiden einzeln.

+0

Das hat funktioniert. Ich habe auch einen anderen Weg gefunden, indem ich den Delegaten zu einer Eigenschaft mache und die adoptierten Protokolle für die ID auf diese Weise festlege. – Cinder6

0

Importieren Sie die Protokolle für Ihre Unterklasse NSWindowController?

Dass die Anwendung funktioniert zeigt mich in diese Richtung. Es scheint, dass der Compiler bei der statischen Überprüfung nicht erkennen kann, dass Ihre Klasse den Protokollen entspricht, während beim Senden tatsächlich die Nachricht erfolgreich ist (und deshalb die Anwendung wie erwartet funktioniert)

+0

Ja, ich habe die Protokolle in die Headerdatei der Unterklasse importiert. Es erscheint mir besonders merkwürdig, dass es sich nur beschwert, dass eines der Protokolle angeblich nicht konform ist. Es ist, als ob es die Delegiertenerklärung ignoriert. – Cinder6

0

Was passiert, wenn Sie die Protokolle getrennt in separate Dateien, dann importieren Sie beide in Ihre NSWindowController Klasse?