gpt4 book ai didi

Objective-C 不创建综合变量

转载 作者:太空狗 更新时间:2023-10-30 03:30:32 25 4
gpt4 key购买 nike

我是 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”似乎可以解决问题,但我很困惑为什么我的下划线合成变量似乎没有生成。任何对此的见解将不胜感激,谢谢!

最佳答案

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

@implemntation PlayingCard
{
NSString *_suit;
}

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

@synthesize suit = _suit;

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

关于Objective-C 不创建综合变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20848392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com