0

私は init メソッドをオーバーライドしようとしている Square クラスを持っています.mは次のようになります:

@implementation Square

{
    Rectangle *rect;
}

@synthesize side;

-(int) area
{
    return side * side;
}

-(int) peremiter
{
    return side * 4;
}

-(id) init
{
    return [self init];
}

-(Square *) initWithSide:(int)s
{
    self = [super init];

    if (self)
     [self initWithSide:s];

    return self;
}

@end

エラーが発生するのは、次のinitWithSideメソッドにあります。

デリゲートの結果は、initすぐに返すか、代入する必要がありますself

4

3 に答える 3

2

これらの行:

if (self)
 [self initWithSide:s];

意味がありません。基本的には、イニシャライザを何度も呼び出すことを意味します。何か役に立つように変更する必要があります (sたとえば、 の値を設定するなど)。ちなみに、引数なしのinit方法も間違っています。そのはず:

-(id) init {
    return [super init];
}

しかし、それには特別な実装がないため、実際にはまったく必要ありません。

于 2013-02-19T20:24:55.780 に答える
1

現在の init メソッドを削除して、これらに置き換えます (インターフェイス スコープで更新することを忘れないでください)。

- (id)init {
    if (self = [super init]) {
        // do whatever you like to to do here
    }
    return self;
}

- (id)initWithSide:(int)s { // but an NSInteger would be more elegant, and the parameter name 's' also would be better to be like 'side'
    if (self = [super init]) {
        [self setSide:s];
    }
    return self;
}
于 2013-02-19T20:46:28.587 に答える
0

これは正しい構文です:

- (id) initWithSide:(int)s{
   self = [super init];
    if (self){
        //init elements 
    }
    return self;
}
于 2013-02-19T20:27:53.660 に答える