1

私は Objective-C にまったく慣れていないので、本の演習を練習していたとき、本当にここで立ち往生していました。これを解決するのを手伝ってください。このエラーの原因を 3 時間以上考えていました。それでもわからなかった!

よろしく、ラージ。

前もって感謝します !

main.m

#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

XYZシャウト.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 の大きな助けに感謝します :)

4

3 に答える 3

6

継承をテストしているように見えるので、XYZShoutから派生するはずだと思いますXYZPerson。その場合は、@JFS からの提案に従い、実際に派生していることを確認してください。

XYZShout.h:

#import <Foundation/Foundation.h>
#import "XYZPerson.h"

@interface XYZShout : XYZPerson

- (void)saySomething:(NSString *)greet;

@end

また、 in の定義を修正しますsaySomething(XYZPersonパラメーターを見逃していました)。

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
于 2013-02-19T11:37:35.527 に答える
4

(コメントから回答に移動しました...)

MatthewD: に乗り換えるとどう - (void) saySomething;なりXYZPerson.hます- (void) saySomething:greet;か?

saySomething:greetRaj0689: に変更すると実行されるのはなぜsaySomethingですか? saySomething挨拶は!!と一緒にのみ定義されているため

メソッドを呼び出すとき、コンパイラはそのメソッドのシグネチャを見つけて、メソッドが正しく呼び出されていることを確認できるようにする必要があります。署名には、メソッド名とパラメーターの数と型が含まれます。メソッド シグネチャを提供する通常の方法は、それらのシグネチャを定義するヘッダー ファイルをインポートすることです。

だから、XYZShout.mあなたが呼び出す場所で:

[super saySomething:upperGreet];

コンパイラは、 によってインポートされた、およびXYZShout.hによってインポートされた を検索します。では、次のメソッドが見つかりました。XYZShout.mXYZPerson.hXYZShout.hXYZShout.h

-(void) saySomething;

これは呼び出されたメソッドの名前に一致しますが、パラメーターには一致しないため、コンパイラはこれを一致とは見なしません。の他の定義はsaySomethingどこにも見つからないため、代わりにエラーが発生します。

于 2013-02-19T21:46:06.570 に答える
3

必ずXYZShout.hインターフェースを@interface XYZShout : XYZPerson?に設定してください。

于 2013-02-19T11:31:03.663 に答える