2

私は現在、Objective-Cを再び起動しています。私が抱えている問題は、クラスインスタンスのネイティブinitメソッドに変数を渡すことです。

@interfaceにこのカスタムinitがあります:

-(id)init
{
    if(self = [super init]) {
        level = 1;
        NSLog(@"Debug response");
    }

    return ([NSObject init]); // return self;
}

そして、これが私のアプリのメインクラスです:

#import "AppDelegate.h"
#import "PlayableCharacter.h"

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
    NSArray *params = [NSArray arrayWithObjects: @"Elf", nil];

    PlayableCharacter *allendar = [[PlayableCharacter alloc] init:params];
}

@end

誰かが私が間違っていることを説明できますか?NSArrayオブジェクトは「id」Cオブジェクトのプロファイルに適合すると思いました。initパラメータを与えることは違法ですか、それとも別の方法で行う必要がありますか?

エラーは次のように述べています:「「PlayableCharacter」の表示された@interfaceはセレクター「init:」を宣言していません」

4

2 に答える 2

9

メソッドにパラメータがありませ-initん。これは、次のCと同等です。

void *init();

void *foo = init(bar); // error

と呼びたい場合は-init:、次のように宣言します

- (id)init:(NSArray *)params;

ただし、これは非常に非標準的な命名です。単一のinitメソッドが本当に必要な場合は、次のNSArrayような名前を付けてください。

- (id)initWithArray:(NSArray *)array;

しかし、サンプルコードから、実際には配列は必要ないと思います。必要なパラメーターは1つだけです。したがって、代わりに使用します

- (id)initWithCharacterClass:(NSString *)className;

そしてそれを次のように呼びます

PlayableCharacter *allendar = [[PlayableCharacter alloc] initWithCharacterClass:@"Elf"];
于 2012-12-17T22:48:30.767 に答える
3

パラメータを使用して初期化する場合は、次のinitようなメソッドを作成します。

-(id)initWithParams:(NSArray *)params
{
    if(self = [super init]) {
        level = 1;
        NSLog(@"Debug response");

        // Do something with params
    }

    return self;
}

また、あなたはただ戻るべきでselfあり、[NSObject init]

于 2012-12-17T22:51:01.970 に答える