我对Objective-C真的很陌生,当我练习书本练习时,我真的被困在这里。请帮我解决这个问题,我一直在思考可能导致此错误的原因超过三个小时。还是没听懂!
此致敬意拉吉。
提前感谢!
主米
#import <Foundation/Foundation.h>
#import "XYZPerson.h"
#import "XYZShout.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
//XYZPerson *some = [[XYZPerson alloc]init];
XYZShout *some = [[XYZShout alloc]init];
[some sayHello];
// insert code here...
// NSLog(@"Hello, World!");
}
return 0;
}
XYZPerson.h
#import <Foundation/Foundation.h>
@interface XYZPerson : NSObject
@property NSString *firstName;
@property NSString *secondName;
@property NSDate *dob;
-(void) saySomething;
-(void) sayHello;
@end
XYZPerson.m
#import "XYZPerson.h"
@implementation XYZPerson
-(void) sayHello {
[self saySomething:@"Hello all"];
}
-(void) saySomething:(NSString *)greet {
NSLog(@"%@", greet);
}
@end
XYZShout.h
#import "XYZPerson.h"
@interface XYZShout : XYZPerson
// -(void) saySomething;
@end
XYZShout.m
#import "XYZShout.h"
@implementation XYZShout
-(void) saySomething:(NSString *)greet {
NSString *upperGreet = [greet uppercaseString];
[super saySomething:upperGreet]; // this is where I get the error mentioned above
}
@end
让它工作!感谢@MatthewD、@trojanfoe、@JFS的大力帮助:)
看起来您正在测试继承,所以我假设XYZShout
应该派生自XYZPerson
。 如果是这样,请遵循@JFS的建议,并确保它确实派生:
XYZShout.h:
#import <Foundation/Foundation.h>
#import "XYZPerson.h"
@interface XYZShout : XYZPerson
- (void)saySomething:(NSString *)greet;
@end
并更正XYZPerson
中saySomething
的定义(您错过了参数(:
XYZPerson.h:
#import <Foundation/Foundation.h>
@interface XYZPerson : NSObject
@property NSString *firstName;
@property NSString *secondName;
@property NSDate *dob;
- (void)saySomething:(NSString *)greet;
// ^^^^^^^^^^^^^^^^^
- (void)sayHello;
@end
(从注释移动到答案...(
MatthewD:如果你把XYZPerson.h
- (void) saySomething;
改成- (void) saySomething:greet;
会怎样?
Raj0689: 为什么当我将其更改为 saySomething:greet
而不是 saySomething
时它会运行?由于问候仅与saySomething
一起定义!!
方法时,编译器需要找到该方法的签名,以便验证是否正确调用了该方法。签名包括方法名称以及参数的数量和类型。提供方法签名的常用方法是导入定义这些签名的头文件。
因此,在您致电XYZShout.m
[super saySomething:upperGreet];
编译器搜索由XYZShout.m
导入的XYZShout.h
,以及由XYZShout.h
导入的XYZPerson.h
。在XYZShout.h
,发现了以下方法:
-(void) saySomething;
这在名称上与调用的方法匹配,但在参数上不匹配,因此编译器不认为这是匹配项。在任何地方都找不到saySomething
的其他定义,因此它会给出错误。
请确保将XYZShout.h
接口设置为 @interface XYZShout : XYZPerson
?