San*_*rck 30 properties objective-c default-value
我正在制作一个应用程序,我有一个具有相当多属性的类,我想知道是否可以给它们一个默认值.因为如果我创建一个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;
Run Code Online (Sandbox Code Playgroud)
那么,在实现中,我正在做类似的事情:
@synthesize aerialAbility = _aerialAbility;
Run Code Online (Sandbox Code Playgroud)
我想知道是否可以这样做:
@interface MyClass : NSObject
@property (nonatomic) int someProperty;
@end
@implementation MyClass
@synthesize someProperty = _someProperty = 10;
@end
Run Code Online (Sandbox Code Playgroud)
我知道这不起作用,这根本不对,但我想知道是否有办法做这样的事情.
像在java中一样,您可以:
class MyClass
{
private int someProperty = 10;
public int getSomeProperty(){return someProperty;}
public void setSomeProperty(int someProperty){this.someProperty = someProperty;}
}
Run Code Online (Sandbox Code Playgroud)
chi*_*uba 50
我之前从未见过这种行为,但我很确定这是分配对象时的init步骤,即设置变量和初始化对象.
-(id)init {
if (self = [super init]) {
self.someProperty = 10;
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
这样称呼它:
MyClass* test = [[MyClass alloc] init];
Run Code Online (Sandbox Code Playgroud)
请注意,您可以拥有多个init函数,这些函数允许您拥有一组不同的默认值.
@synthesize所做的是告诉预编译器它应该为set/get生成代码,而不是设置属性的值.'='只是告诉前译员,即使变量的名称和属性不相同,它们也应该连接起来.
此外,作为一个个人意见(完全没有涉及到这个问题),这个对象似乎很大,你可能会以某种方式将其拆分或像其他人建议的那样.也许这个类可以继承其他一些类来为它提供它需要的不同属性?正如我所说,这只是一个建议,因为我不知道你的其他代码是什么样的:)
对于像这样的大量属性,我倾向于将数据存储为字典而不是单个属性,我会将默认值存储在属性列表中. NSDictionary可以使用属性列表轻松初始化对象.
如果使用字典不符合您的口味,我仍然会将默认值存储在属性列表中,并且在指定的初始化程序中,我会遍历属性列表中的项目并将它们应用于self使用键值编码.您应该注意,这仅适用于可信数据,而不适用于用户提供的数据,否则可能会被劫持以设置您不期望的其他属性.