2

私はobjective-cを学んでいる最中なので、私の無知を許してください。オブジェクトのプロパティをそのオブジェクトのインスタンス メソッドのパラメーターとして使用するにはどうすればよいですか? たとえば、名前と設定 (列挙型) の 2 つのパラメーターを持つオブジェクト FamilyMember を作成したとします。これらのプロパティを dinnerPrefMethod メソッドのパラメーターとして使用したい場合、どうすればよいでしょうか。これは私がこれまでに持っているものであり、ご覧のとおり、メソッドを呼び出したい場合は、その人の好みを手動で入力する必要があります。私の目標は、メソッドを呼び出して、オブジェクトの 2 つのプロパティをパラメーターとして取得できるようにすることです。

@implementation FamilyMember

@synthesize name, preference;


-(void) dinnerPrefMethod : (dinnerPreference) x; {
    NSLog(@"Lets see what %@ wants for dinner", name);
    switch( x )
{
    case pizza:
        NSLog(@"%@ wants pizza", name);
        break;
    case steak:
        NSLog(@"%@ wants steak", name);
        break;
    case seafood:
        NSLog(@"%@ wants seafood", name);
        break;
    case dunno:
        NSLog(@"%@ doesn't know", name);
        break;
}
}
@end
4

2 に答える 2

0

ご覧のとおり、メソッドでオブジェクトのプロパティを使用しています。その場合、直接アクセスできるため、これらの値を渡す必要はありません。


アップデート

-(void) dinnerPrefMethod {
    NSLog(@"Lets see what %@ wants for dinner", self.name);
    switch(self.preference)
    {
    case pizza:
        NSLog(@"%@ wants pizza", self.name);
        break;
    case steak:
        NSLog(@"%@ wants steak", self.name);
        break;
    case seafood:
        NSLog(@"%@ wants seafood", self.name);
        break;
    case dunno:
        NSLog(@"%@ doesn't know", self.name);
        break;
    }
}
于 2012-12-31T03:49:26.873 に答える
0

これらのプロパティを dinnerPrefMethod メソッドのパラメーターとして使用したい場合、どうすればよいでしょうか。[...] 私の目標は、メソッドを呼び出して、オブジェクトの 2 つのプロパティをパラメーターとして取得できるようにすることです。

これをすべて回避したいようです:

FamilyMember *familyMember = [[FamilyMember alloc] init];
[familyMember setName:@"First Last"];
[familyMember setPreference:dunno];
[familyMember announceDinnerPreference];

どこ-[FamilyMember announceDinnerPreference]にあなたの修正版がありますdinnerPrefMethod:

- (void)announceDinnerPreference
{
    NSLog(@"Let's see what %@ wants for dinner...", [self name]);
    switch ([self preference]) {
        case pizza:
            NSLog(@"%@ wants pizza.", [self name]);
            break;
        case steak:
            NSLog(@"%@ wants steak.", [self name]);
            break;
        case seafood:
            NSLog(@"%@ wants seafood.", [self name]);
            break;
        case dunno:
            NSLog(@"%@ doesn't know.", [self name]);
            break;
    }
}

おそらく、メソッドを定義したいでしょう-[FamilyMember setName:preference:announceDinnerPreference:]

- (void)setName:(NSString *)name preference:(dinnerPreference)preference announceDinnerPreference:(BOOL)announce
{
    [self setName:name];
    [self setPreference:preference];
    if (announce) {
        [self announceDinnerPreference];
    }
}

これにより、次のように書くことができます

FamilyMember *familyMember = [[FamilyMember alloc] init];
[familyMember setName:@"First Last" preference:dunno announceDinnerPreference:YES];

率直に言って、これはスタイル的に非常に奇妙です。


はるかにスタイリッシュな方法のアプローチは、定義することです-initWithName:preference:

- (id)initWithName:(NSString *)name preference:(dinnerPreference)preference
{
    self = [super init];
    if (self) {
        [self setName:name];
        [self setPreference:preference];
    }
    return self;
}

あなたはそれから書くことができるでしょう

FamilyMember *familyMember = [[FamilyMember alloc] initWithName:@"First Last" preference:dunno];
[familyMember announceDinnerPreference];

では、オブジェクトのプロパティをパラメータであると言わずにメソッドで使用できますか?

はい。オブジェクトのインスタンス変数は、そのインスタンス メソッド内でアクセスできます。

于 2012-12-31T03:50:51.410 に答える