2 parameters class objective-c
我目前正在重新开始使用一些 Objective-C。我遇到的问题是将变量传递给类实例的本机 init 方法。
我的@interface 中有这个自定义初始化:
-(id)init
{
if(self = [super init]) {
level = 1;
NSLog(@"Debug response");
}
return ([NSObject init]); // return self;
}
Run Code Online (Sandbox Code Playgroud)
这是我的应用程序的主类:
#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
Run Code Online (Sandbox Code Playgroud)
有人可以解释我做错了什么吗?我认为 NSArray 对象将适合“id”C 对象的配置文件。提供 init 参数是非法的还是必须以其他方式完成?
错误指出:“‘PlayableCharacter’没有可见的@interface 声明了选择器‘init:’”
您的-init
方法没有任何参数。它相当于下面的C:
void *init();
void *foo = init(bar); // error
Run Code Online (Sandbox Code Playgroud)
如果您想将其称为 as -init:
,那么您可以将其声明为
- (id)init:(NSArray *)params;
Run Code Online (Sandbox Code Playgroud)
然而,这在很大程度上是一个非标准的命名。如果你真的想要一个接受单个的 init 方法NSArray
,那么也许可以将它命名为
- (id)initWithArray:(NSArray *)array;
Run Code Online (Sandbox Code Playgroud)
但是从您的示例代码中,我猜您实际上并不需要数组,您只需要一个参数。所以你会用
- (id)initWithCharacterClass:(NSString *)className;
Run Code Online (Sandbox Code Playgroud)
然后将其称为
PlayableCharacter *allendar = [[PlayableCharacter alloc] initWithCharacterClass:@"Elf"];
Run Code Online (Sandbox Code Playgroud)