【问题标题】:Accessing properties of an object as parameters for a method访问对象的属性作为方法的参数
【发布时间】:2012-12-15 08:20:28
【问题描述】:

我正在学习objective-c,所以请原谅我的无知。如何使用对象的属性作为该对象的实例方法的参数?例如,我创建了一个带有两个参数的对象 FamilyMember,名称和首选项(一个枚举)。如果我想将这些属性用作dinnerPrefMethod 方法的参数,该怎么做。这是我目前所拥有的,如您所见,如果我想调用该方法,我必须手动输入该人的偏好。我的目标是能够调用该方法,并将对象的两个属性作为参数。

@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

【问题讨论】:

    标签: objective-c object methods


    【解决方案1】:

    正如我所见,您在其方法中使用了对象的属性。在这种情况下,您不必传递这些值,因为您可以直接访问它们。


    更新

    -(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;
        }
    }
    

    【讨论】:

    • 所以我可以在方法中使用对象的属性而不说它们是参数?
    • 是的,仅在实例方法中(表示方法属于同一类)
    • 谢谢,但是当我这样做时,当我声明“语句需要整数类型的表达式('dinnerPreference' 无效)”的 switch 语句时,我得到了一个错误
    • 你会发布你的dinnerPreference枚举的定义吗?
    • 使用@property dinnerPreference preference; 因为dinnerPreference 不是一个类而是枚举所以你不需要引用而是变量
    【解决方案2】:

    如果我想将这些属性用作dinnerPrefMethod 方法的参数,该怎么做。 [...] 我的目标是能够调用该方法,并将对象的两个属性作为参数。

    听起来你想避免做这一切:

    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];
    

    所以我可以在方法中使用对象的属性而不说它们是参数?

    是的。对象的实例变量可以在其实例方法中访问。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-19
      • 1970-01-01
      相关资源
      最近更新 更多