Ios 在init函数中访问类的NSDictionary属性时出现错误;使用未声明的标识符";。需要帮助了解原因吗
这里是一个用于一组卡片的类,这些卡片可能有几种不同的配置,我使用NSDictionary定义这些配置,其中包含字符串键和如何添加卡片的数组值。我还没有完成init函数,但在尝试访问NSDictionary属性时会出现上述错误。对于objective-c来说,这是一个相当新的问题,如果这是一个微不足道的问题,那么很抱歉 这是我的.m类文件:Ios 在init函数中访问类的NSDictionary属性时出现错误;使用未声明的标识符";。需要帮助了解原因吗,ios,objective-c,Ios,Objective C,这里是一个用于一组卡片的类,这些卡片可能有几种不同的配置,我使用NSDictionary定义这些配置,其中包含字符串键和如何添加卡片的数组值。我还没有完成init函数,但在尝试访问NSDictionary属性时会出现上述错误。对于objective-c来说,这是一个相当新的问题,如果这是一个微不足道的问题,那么很抱歉 这是我的.m类文件: @interface MarioCardDeck() @property (strong, nonatomic)NSDictionary *cardConf
@interface MarioCardDeck()
@property (strong, nonatomic)NSDictionary *cardConfigurations;
@end
@implementation MarioCardDeck
- (instancetype)init {
self = [super init];
if(self) {
unsigned index = arc4random() % [[cardConfigurations allKeys] count]; ** error line
}
return self;
}
- (NSDictionary *)cardConfigurations
{
if(!_cardConfigurations)
{
_cardConfigurations = @{
@"1" :
@[@"flower",@"coin20",@"mushroom",@"star",@"oneUp",@"flower",@"oneUp",@"flower",@"coin10",@"mushroom",@"coin20",@"star",@"mushroom",@"coin10",@"star",@"mushroom",@"flower",@"star"],
@"2" :
@[@"flower",@"coin10",@"oneUp",@"flower",@"oneUp",@"mushroom",@"star",@"mushroom",@"coin20",@"star",@"mushroom",@"coin10",@"star",@"flower",@"coin20",@"mushroom",@"flower",@"star"]
};
}
return _cardConfigurations;
}
@end
您需要通过
self.cardConfigurations
引用它。您需要:
unsigned index = arc4random() % [[self.cardConfigurations allKeys] count];
您需要使用self
访问该属性
仅供参考-您应使用:
unsigned index = arc4random_uniform([[self.cardConfigurations allKeys] count]);
你需要改变
unsigned index = arc4random() % [[cardConfigurations allKeys] count];
到
然而,在Objective-C中访问init方法中的属性是一件危险的事情。如果getter在子类中被重写,您可能会得到一个可怕的惊喜。我将为索引创建另一个属性,将实例变量分配给NSNotFound,并在第一次调用getter方法时进行计算。而且您应该使用NSUInteger作为存储索引的类型。属性是延迟加载的,因此在任何情况下直接使用ivar都不是一个好主意。在
init
中发送消息self
也不是一个好主意。同意,但只有在子类重写属性的getter时才会成为一个潜在问题。您认为最好只需将CardConfiguration设置为类方法?如果字典从未更改,您可以将其设置为类方法来节省一些内存。有没有一种方法可以实现自我暗示?我刚开始学习,我想我在什么地方读到了关于@synthetic
允许你不必显式声明自我?但是对我来说,@synthesis
和使用self
还是没有多大意义self
用于引用调用方所在实例中的任何内容,无论是属性还是实例方法。你绕不开它。
unsigned index = arc4random() % [[self.cardConfigurations allKeys] count];