我正在做一个应用程序,我有一个有很多属性的类,我想知道是否可以给它们一个默认值。因为如果我做一个init方法,输入所有东西的工作量很大,很有可能会出现输入错误,而且编码也不是很好……
这是我的类的样子:
// Goalkeeping attributes
@property (nonatomic) int aerialAbility;
@property (nonatomic) int commandOfArea;
@property (nonatomic) int communication;
@property (nonatomic) int eccentricity;
@property (nonatomic) int handling;
@property (nonatomic) int kicking;
@property (nonatomic) int oneOnOnes;
@property (nonatomic) int reflexes;
@property (nonatomic) int rushingOut;
@property (nonatomic) int tendencyToPunch;
@property (nonatomic) int throwing;
// Technical attributes
@property (nonatomic) int corners;
@property (nonatomic) int crossing;
@property (nonatomic) int dribbling;
@property (nonatomic) int finishing;
@property (nonatomic) int firstTouch;
@property (nonatomic) int freeKickTaking;
@property (nonatomic) int heading;
@property (nonatomic) int longShots;
@property (nonatomic) int longThrows;
@property (nonatomic) int marking;
@property (nonatomic) int passing;
@property (nonatomic) int penaltyTaking;
@property (nonatomic) int tackling;
@property (nonatomic) int technique;
// Mental attributes
@property (nonatomic) int aggression;
@property (nonatomic) int anticipation;
@property (nonatomic) int bravery;
@property (nonatomic) int composure;
@property (nonatomic) int concentration;
@property (nonatomic) int creativity;
@property (nonatomic) int decisions;
@property (nonatomic) int determination;
@property (nonatomic) int flair;
@property (nonatomic) int influence;
@property (nonatomic) int offTheBall;
@property (nonatomic) int positioning;
@property (nonatomic) int teamwork;
@property (nonatomic) int workRate;
// Physical attributes
@property (nonatomic) int acceleration;
@property (nonatomic) int agility;
@property (nonatomic) int balance;
@property (nonatomic) int jumping;
@property (nonatomic) int naturalFitness;
@property (nonatomic) int pace;
@property (nonatomic) int stamina;
@property (nonatomic) int strength;所以,在实现中,我做了一些类似的事情:
@synthesize aerialAbility = _aerialAbility;我想知道是否有可能这样做:
@interface MyClass : NSObject
@property (nonatomic) int someProperty;
@end
@implementation MyClass
@synthesize someProperty = _someProperty = 10;
@end我知道这是行不通的,这是完全不正确的,但我想知道是否有办法做到这一点。
就像在java中一样,你可以:
class MyClass
{
private int someProperty = 10;
public int getSomeProperty(){return someProperty;}
public void setSomeProperty(int someProperty){this.someProperty = someProperty;}
}发布于 2012-03-23 04:55:00
我以前从未见过这种行为,但我非常确定这就是分配对象时的init步骤,即设置变量和初始化对象。
-(id)init {
if (self = [super init]) {
self.someProperty = 10;
}
return self;
}这个名字是这样的:
MyClass* test = [[MyClass alloc] init];请注意,您可以有多个init函数,这允许您有几组不同的默认值。
@synthesize做的是告诉预编译器它应该为set/get生成代码,而不是设置属性的值。'=“只是告诉预编译器,尽管变量和属性的名称不同,但它们应该连接在一起。
此外,作为个人观点(与问题完全无关),这个对象似乎太大了,您可以以某种方式将其拆分,或者按照其他人的建议进行操作。也许这个类可以继承其他几个类,为它提供所需的不同属性?正如我所说的,这只是一个建议,因为我不知道您的其他代码是什么样子的:)
发布于 2012-03-23 05:03:13
对于如此大量的属性,我倾向于将数据存储为字典而不是单个属性,并且我会将默认值存储在属性列表中。可以使用属性列表轻松地初始化NSDictionary对象。
如果使用字典不符合您的口味,我仍然会将默认值存储在属性列表中,并在指定的初始化器中循环属性列表中的项,并使用键值编码将它们应用于self。您应该注意到,这只适用于受信任的数据,而不适用于用户提供的数据,否则它可能会被劫持来设置您不期望的其他属性。
发布于 2012-03-23 05:08:35
在Objective C中,没有内置的类似Java语言的方法来初始化合成属性或ivars。然而,由于您的属性看起来几乎相同,您可能会考虑将它们设置为@dynamic而不是合成它们。
当然,您需要编写两个看起来很可怕的方法(对您来说是here is a nice and clean example),但作为回报,您可以在NSMutableDictionary中以统一的方式将属性存储为对象。这打开了几个有趣的替代方案,在普通的ivars中没有:你可以将你的属性的初始化推迟到需要的时候,你可以为未设置的属性提供默认值,或者你可以通过在字典中填入它们的键值来“批量”初始化你的属性。
https://stackoverflow.com/questions/9830317
复制相似问题