Setter必须有一个参数

时间:2014-02-02 21:09:47

标签: objective-c

我写了一个没有按预期工作的setter。我正在读取文件中的统计信息,并使用这些统计信息填充SVTeam对象的属性。但是,需要计算某些属性(因为它们未在文件中提供)。其中一个属性保留了特定团队的主场胜率。我不需要为setter提供参数。两个问题:

  1. 由于我不是在我的二传手中提供一个参数,它是否真的是一个客观意义上的制定者?
  2. 即使它不是真正的设置器,为什么下面的代码仍将属性保留为null
  3. SVTeam.h

    @interface SVTeam : NSObject
    @property (weak, nonatomic) NSNumber *homePercentage;
    ...
    ...
    

    SVTeam.m

    #import "SVTeam.h"
    @implementation SVTeam
    @synthesize homePercentage = _homePercentage;
    ...
    ...
    
    -(void) setHomePercentage
    {
        float wins = [_homeWins floatValue];
        float losses = [_homeLosses floatValue];
        float ties = [_homeTies floatValue];
        float winPercentage = wins / (wins+losses+ties);
        self.homePercentage = [NSNumber numberWithFloat:winPercentage];
    }
    

2 个答案:

答案 0 :(得分:7)

由于homePercentage是基于其他属性的计算值,因此您可以将其设置为只读属性,而您将在getter中使用计算逻辑。如果您将其保留为setter,那么您的消费者必须首先确保调用setter并调用getter来检索该值。

@property(nonatomic,readonly) NSNumber *homePercentage;

你的getter定义是

- (NSNumber *)homePercentage
{
  ...
  return [NSNumber numberWithFloat:winPercentage];
}

答案 1 :(得分:3)

扩展Garfield81的答案:

如果要覆盖由clang为您homePercentage属性合成的setter,则需要在类中实现-(void)setHomePercentage:(NSNumber *)homePercentage;Apple documentation on properties

回答你的两个问题:

  

1)因为我不是在我的二传手中提供一个参数,它是否真的是一个客观意义上的制定者?

没有。合成的setter采用相同类型的属性的唯一参数,并命名为set<CapitalizedPropertyName>。你所做的就是申报一种新方法。

  

2)即使它不是真正的setter,为什么下面的代码仍然将属性保留为null

homePercentage没有明显的理由留下nil(不是null)您提供的代码。你确定你的自定义方法被调用了吗? (请记住,当使用点符号(self.homePercentage)时,这是-(void)setHomePercentage:(NSNumber *)homePercentage;,而不是-(void)setHomePercentage;。{/ p>

另请注意,您无需添加@synthesize homePercentage = _homePercentage; unless you override both the getter and the setter