setDelegate: self генерирует флаг предостережения - PullRequest
6 голосов
/ 11 августа 2011

Я пытаюсь изучить Цель C и у меня есть ошибка в коде для одного из моих уроков, и я не знаю, как ее решить. Код:

 //  AppController.m

 #import "AppController.h"

 @implementation AppController

 - (id)init
    {
         [super init];
         speechSynth = [[NSSpeechSynthesizer alloc] initWithVoice:nil];
         [speechSynth setDelegate:self];
         voiceList = [[NSSpeechSynthesizer availableVoices] retain];
         Return self;
    }

Из [speechSynth setDelegate: self]; Я получаю сообщение об ошибке: «AppController *» отправляется параметру несовместимого типа «id ». Программа компилируется с флагом предостережения и, кажется, работает правильно. Я сравнил свой код с кодом автора и не могу найти различий, и ни один из моих поисков не показал, что я должен получить ошибку в этой строке. Книга была написана для Xcode 3, и я использую Xcode 4.0.2.

Буду очень признателен за любые предложения или указания мне в правильном направлении. Спасибо.

Ответы [ 2 ]

14 голосов
/ 11 августа 2011

Xcode предупреждает вас, что метод setDelegate ожидает экземпляр класса, который реализовал протокол NSSpeechSynthesizerDelagate.Теперь у вас есть, но вы, вероятно, просто забыли заявить, что у вас есть.В объявлении вашего класса замените

@class AppController : NSObject

на

@class AppController : NSObject<NSSpeechSynthesizerDelegate>

, чтобы сказать миру «Я подчиняюсь NSSpeechSynthesizerDelegate!», И отключите предупреждение.Вы никогда не знаете - вас могут предупредить, что вы забыли реализовать некоторые необязательные методы делегата и избавить себя от досадной ошибки где-нибудь в будущем.

2 голосов
/ 25 марта 2012

Когда вы разыгрываете собственный объект, предупреждающее сообщение исчезает.

[speechSynth setDelegate:(id < NSSpeechSynthesizerDelegate >) self];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...