【问题标题】:Objective-C Not Creating Synthesized VariablesObjective-C 不创建综合变量
【发布时间】:2023-03-07 08:10:01
【问题描述】:

我是一名 iOS 开发新手,仍然习惯于合成变量和 XCode 自动创建变量和 setter/getter 方法的概念。我做了很多研究,但无法找到解决我所面临问题的答案。

我创建了一个头类如下:

#import "Card.h"

@interface PlayingCard : Card

@property (strong, nonatomic) NSString *suit;
@property (nonatomic) NSUInteger rank;

@end

我有以下实现类:

#import "PlayingCard.h"

@implementation PlayingCard

- (NSString *)contents
{
    NSArray *rankStrings = @[@"?",@"A",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"J",@"Q",@"K"];
    return [rankStrings[self.rank] stringByAppendingString:self.suit];
}

- (void)setSuit:(NSString *)suit
{
    if([@[@"♥︎",@"♦︎",@"♠︎",@"♣︎"] containsObject:suit]) {
        _suit = suit;
    }
}

- (NSString *)suit
{
    return _suit ? _suit : @"?";
}

@end

我的错误是,每当我使用 _suit 变量时,我都会从 XCode 中收到一条错误消息:

Use of undeclared identifier '_suit'; did you mean 'suit'?

据我了解,_suit 是由编译器自动生成的,我应该能够使用“_suit”访问头文件中定义的“suit”属性。是因为我覆盖了编译器自动生成的 setter 和 getter 方法吗?将“_suit”更改为“self.suit”似乎可以解决问题,但我很困惑为什么似乎没有生成我的下划线合成变量。任何对此的见解将不胜感激,谢谢!

【问题讨论】:

    标签: objective-c properties


    【解决方案1】:

    如果您为@property 手动创建两个访问器(setter 和 getter),编译器会假定您不需要/不希望它为您合成它们以及相应的实例变量。有两种可能的解决方案。要么自己声明实例变量:

    @implemntation PlayingCard
    {
        NSString *_suit;
    }
    

    或者,我的首选方法是,在自定义访问器上方使用显式 @synthesize 语句,告诉编译器您仍想为属性合成实例变量:

    @synthesize suit = _suit;
    

    请注意,= _suit 是必需的,因为由于遗留原因,简单的 @synthesize suit; 将默认命名为 ivar suit,不带下划线前缀。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多