Получение очень странной ошибки «несовместимые типы-цели».Может быть, кто-то еще может увидеть, где я иду не так? - PullRequest
0 голосов
/ 27 мая 2011

Должно быть, это одна из тех вещей, где я пропустил крошечную ошибку, или что-то в этом роде, но я не могу понять это.

Viewcontroller.h

#import "RGBEditView.h"
@interface ColorPickerView : UIViewController {
RGBEditView *rgbEditView;
}
-(void)showRGBEditor;

.m

-(void)showRGBEditor {
rgbEditView = [[RGBEditView alloc] initWithFrame:CGRectMake(0, 0, 280, 46) H:h S:s B:b];
}

Эта строка выше, строка initwithframe, дает ошибку 'Incompatible Objective-C types assigning '*', expected '*'

RGBEditView.h

@interface RGBEditView : UIView {
}
-(RGBEditView *)initWithFrame:(CGRect)frame H:(float)hue S:(float)saturation B:(float)brightness;

RGBEditView.m

-(RGBEditView *)initWithFrame:(CGRect)frame H:(float)hue S:(float)saturation B:(float)brightness {
[super initWithFrame:frame];
 return self;
}

Кто-нибудь может увидеть мою проблему? Я очень смущен этим.

EDIT:

Проблема заключается в том, что у меня есть другой класс, который также использует initWithFrame: H: S: B:, поэтому единственный способ исправить это - заменить их на что-то немного другое, но это выглядит как неуклюжая работа. вокруг. Любые другие решения?

Ответы [ 3 ]

4 голосов
/ 27 мая 2011

методы init и методы, начинающиеся с initWith, должны возвращать тип id.

, что обычно происходит, когда у вас есть 2 класса с одинаковым именем метода (инициализатор в данном случае), но различаются по типам возвращаемых данных:

RGBEditView

  -(RGBEditView *)initWithFrame:(CGRect)frame H:(float)h S:(float)s B:(float)b;

HSBEditView

  -(HSBEditView *)initWithFrame:(CGRect)frame H:(float)h S:(float)s B:(float)b;

alloc возвращает идентификатор - компилятор предупреждает вас, потому что видит выражение, похожее на присвоение типа, используемое в следующем примере:

RGBEditView * rgb = /* ... */;
HSBEditView * hsb = nil;
hsb = rgb // << compiler: "hey - you don't want to do that unless
          //               RGBEditView were a subclass of
          //               HSBEditView... but it's not!"

вы исправляете это, возвращая id из ваших инициализаторов, например так:

-(id)initWithFrame:(CGRect)frame H:(float)h S:(float)s B:(float)b;

вы возвращаете id, чтобы избежать подобных конфликтов, и поскольку компилятор не знает, какой тип возвращается через alloc, поэтому каждое объявление подкласса должно будет возвращать другой тип - что приведет только к дополнительным проблемам.

Исключением является использование высококвалифицированных имен, что обычно можно увидеть в удобных конструкторах:

+ (HSBEditView *)newHSBEditViewWithFrame:(CGRect)frame
                                       H:(float)h S:(float)s B:(float)b;
0 голосов
/ 27 мая 2011

initWithFrame должен быть

-(RGBEditView *)initWithFrame:(CGRect)frame H:(float)hue S:(float)saturation B:(float)brightness {
    self = [super initWithFrame:frame];
    return self;
}
0 голосов
/ 27 мая 2011

в RGBEditView.m попробуйте

self = [super initWithFrame:frame];
return self;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...