Objective-C 错误"没有可见的@interface'XYZPerson' 声明选择器'saySomething'



我对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

并更正XYZPersonsaySomething的定义(您错过了参数(:

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

最新更新