Несовместимый тип для аргумента 1 'setBounds' - PullRequest
1 голос
/ 01 февраля 2010

Я пытаюсь создавать свои собственные пользовательские классы и изучать C и Objective C. Я получаю сообщение об ошибке, что существует несовместимый тип для аргумента 1. Я определил структуру и класс, как это:

typedef enum {
 kRedColor,
 kGreenColor,
 kBlueColor
} ShapeColor;


typedef struct {
 int x, y, width, height;
} ShapeRect;


@interface Shape : NSObject
{
 ShapeColor  fillColor;
 ShapeRect   bounds;
}

- (void) setFillColor: (ShapeColor) fillColor;
- (void) setBounds: (ShapeRect) bounds;
- (void) draw;

@end // Shape

Затем я импортирую файл Shape.h (код выше) и пытаюсь создать форму, подобную этой:

id фигур [4]; // Я другой!

ShapeRect rect0 = {0, 0, 10, 30}; shape [0] = [Shape new]; [shape [0] setBounds: rect0];

Я получаю сообщение об ошибке, что setBounds несовместим. По какой-то причине он не смотрит на класс Shape.h для метода setBounds, а вместо этого смотрит на метод setBounds по умолчанию? Я что-то не так делаю? Спасибо!

Ответы [ 2 ]

3 голосов
/ 02 февраля 2010

Если есть другой метод с именем setBounds:, то использование типа id обычно приводит к тому, что компилятор выбирает первый встреченный setBounds: (для определения возвращаемых типов и типов аргументов), и поскольку ваш, вероятно, не первый, он дает ошибку. Вам также нужно сообщить компилятору, что вы хотите использовать ваш setBounds:, изменив тип с id на Shape *, но вы также можете привести свой id к Shape * и должно работать также:

[(Shape *)shapes[0] setBounds:rect0];
0 голосов
/ 02 февраля 2010

С вашим кодом, shapes[0] - это просто id, для которого компиляция не знает, что setBounds:. Вместо этого вы должны объявить shapes как

Shape* shapes[4];

Кстати, если у вас возникла ошибка, пожалуйста, напишите точно, какая ошибка была выложена компилятором, а не просто говорила «... было несовместимо», потому что есть много способов, которыми вещь может быть несовместимой! Записав это явно, люди могли бы ответить на ваш вопрос, потому что таким образом нам не нужно точно угадывать, что произошло. Со временем вы сами сможете понять из сообщения об ошибке, что происходит не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...