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