- (двойной) допустимый тип возвращаемого значения для метода в Objective C

Я пытаюсь вернуть двойник из другого объекта, а затем сохранить его в новый двойник, но я получаю сообщение об ошибке несовместимых типов при инициализации. Что мне здесь не хватает?

double gradePoints = 0.0;
double other = [aCourse getGradePoints];
gradePoints = gradePoints + other;

Это в моем другом объекте

- (double) getGradePoints{
   return 12.0;
 }

person aahrens    schedule 14.04.2010    source источник


Ответы (3)


Скорее всего, вы забыли добавить метод getGradePoints в объявление интерфейса: в результате метод будет неявно объявлен как -(id)getGradePoints; что приводит к предупреждению, которое вы видите.

person Williham Totland    schedule 14.04.2010
comment
Это кажется единственным разумным объяснением. - person T .; 14.04.2010

Ссылка на aCourse напечатана или это id? Если я правильно помню, если класс aCourse не известен компилятору, он предполагает, что результатом всех вызовов метода является тип id.

person Geoff Reedy    schedule 14.04.2010
comment
Да, это введено в мой пользовательский класс Course *aCourse = [[Course alloc]init]; - person aahrens; 14.04.2010
comment
Не совсем. Если компилятор не знает ни одного метода, соответствующего сигнатуре (в данном случае -getGradePoints), он предполагает, что возвращаемый тип будет id, а любые аргументы будут id, ... (или просто ..., я никак не могу вспомнить). Этот метод явно отсутствует в объявлении интерфейса Course. - person Williham Totland; 14.04.2010

Стандарт геттера/сеттера kvo определяет геттеры в форме getPropertyName. Если у вас есть свойство с именем gradePoints, компилятор будет интерпретировать getGradePoints как геттер для этого свойства, и если свойство не определено как двойное, он будет жаловаться.

Даже определяя локальную переменную следующим образом:

double gradePoints = 0.0;
double other = [aCourse getGradePoints];

... может запутать компилятор, потому что он может попытаться обработать getGradePoints в качестве получателя дляgradePoints.

Objective-C опирается на соглашения об именах для поиска конкретных типов методов, потому что во время компиляции он не может предположить, какие методы будут у объекта в конкретных обстоятельствах.

Как правило, вам следует избегать использования имен методов, начинающихся с «get» и «set», потому что компилятор хочет рассматривать их как методы получения и установки свойств. Потенциал путаницы компилятора высок.

Я стараюсь использовать такие префиксы, как «выбрать», «схватить», «получить» и т. д. вместо «получить», просто на всякий случай.

person TechZen    schedule 14.04.2010
comment
На самом деле, разве они не определены как просто -propertyName? Или оба? - person Williham Totland; 14.04.2010
comment
Старая школа «получить» все еще активна. Я столкнулся с проблемами в Obj-C 2.0, случайно создав метод getPropertyName (не предназначенный для получения), который возвращал тип, отличный от свойства. В Obj-C важно тщательно называть свои методы. - person TechZen; 14.04.2010