objective c - superponer - Objective-C establece el valor predeterminado para una propiedad
superponer graficas en r (7)
Estoy creando una aplicación, tengo una clase con muchas propiedades y me preguntaba si era posible darles un valor predeterminado. Porque si hago un método de inicio, es mucho trabajo escribir todo, hay una gran posibilidad de errores tipográficos y no es una buena codificación ...
Así es como se ve mi clase:
// 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;
Entonces, en la implementación, estoy haciendo algo como:
@synthesize aerialAbility = _aerialAbility;
Y me preguntaba si sería posible hacer esto:
@interface MyClass : NSObject
@property (nonatomic) int someProperty;
@end
@implementation MyClass
@synthesize someProperty = _someProperty = 10;
@end
Sé que esto no funcionará, y esto no está bien, pero me preguntaba si hay una manera de hacer algo como esto.
Como en java puedes:
class MyClass
{
private int someProperty = 10;
public int getSomeProperty(){return someProperty;}
public void setSomeProperty(int someProperty){this.someProperty = someProperty;}
}
La sugerencia del diccionario de arriba es buena. Algunas veces he usado objetos de configuración dedicados:
@interface MySegmentedControl : UISegmentedControl
@property (assign, nonatomic) CGFloat systemFontOfSize;
@end
Si es necesario, esta clase podría tener un método de inicio que establece un conjunto de valores y valores predeterminados.
Probablemente también podría usar una estructura de estilo c, ya que estos son solo primitivos.
Es cierto que esto no es más que aplazar el problema, mover la inicialización de una clase a la clase de configuración, pero:
- Tendrías que hacer esto con un diccionario de todos modos
- Puedes comentar los ajustes de configuración.
- La mayor ganancia: la clase de configuración está fuertemente tipada, lo que detecta errores en el momento de la compilación, permite la finalización del código xcode
Podrías dividir las configuraciones en diferentes tipos (portero, técnico y mental). Nuevamente, solo se está dividiendo el problema, pero eso puede ayudar a mantener las cosas enfocadas.
No hay una forma integrada de Java de inicializar propiedades sintetizadas o ivars en Objective C. Sin embargo, como sus propiedades parecen casi idénticas, es posible que desee considerar la posibilidad de convertirlas en @dynamic
lugar de sintetizarlas.
Por supuesto, necesitaría escribir dos métodos de aspecto aterrador ( este es un ejemplo agradable y limpio para usted), pero a cambio, obtiene una manera uniforme de almacenar sus propiedades como objetos dentro de NSMutableDictionary
. Esto abre varias alternativas interesantes que no están disponibles con ivars simples: puede aplazar la inicialización de sus propiedades hasta que sean necesarias, puede proporcionar valores predeterminados para propiedades sin establecer, o puede inicializar sus propiedades al por mayor completando el diccionario con los valores para sus llaves
Nunca he visto este comportamiento antes, pero estoy bastante seguro de que este es el paso inicial para cuando se asigna un objeto, es decir, establecer variables e inicializar el objeto.
-(id)init {
if (self = [super init]) {
self.someProperty = 10;
}
return self;
}
Y así lo llaman así:
MyClass* test = [[MyClass alloc] init];
Tenga en cuenta que puede tener más de una función de inicio que le permite tener algunos conjuntos diferentes de valores predeterminados.
Lo que @synthesize hace es decirle al precompilador que debe generar el código para el conjunto / obtener, no establecer el valor de la propiedad. El ''= "solo le dice al precompletador que, aunque el nombre de la variable y la propiedad no sean los mismos, deberían estar conectados.
Además, como una opinión personal (no relacionada con la pregunta en absoluto), este objeto parece demasiado grande y usted podría ser capaz de dividirlo de alguna manera o hacer lo que otra persona sugirió. ¿Quizás esta clase podría heredar de algunas otras clases para darle las diferentes propiedades que necesita? Como dije, es solo una sugerencia ya que no sé cómo se ve tu otro código :)
Otra posibilidad sería anular los captadores predeterminados para las propiedades. En sus captadores, puede ver si los valores se inicializaron y, si no, devolver su valor predeterminado. (Eso funcionaría para algunos tipos de propiedades, pero no para otros, claramente: necesita que el valor predeterminado sea uno que indique que no se estableció ningún valor).
Para una cantidad tan grande de atributos como ese, me inclino a almacenar los datos como un diccionario en lugar de propiedades individuales, y almacenaría los valores predeterminados en una lista de propiedades. NSDictionary
objetos NSDictionary
se pueden inicializar fácilmente con una lista de propiedades.
Si utilizar un diccionario no es de su agrado, aún así almacenaría los valores predeterminados en una lista de propiedades y, en el inicializador designado, recorrería los elementos de la lista de propiedades y los aplicaría a self
codificación self
de valores clave. Debe tener en cuenta que esto solo es apropiado para datos de confianza, no datos proporcionados por el usuario, ya que de otro modo podría ser secuestrado para establecer otras propiedades que no está esperando.
Sí, puede anular getter en caso de establecer un valor predeterminado antes de que se inite la propiedad.
Por ejemplo, defina la propiedad en el archivo .h:
@interface GoalKeepingAttributes
@property (nonatomic) int agression
@property (nonatomic) int ... etc
@end
@implementation GoalKeepingAttributes
@end
e invalidar getter y establecer el valor predeterminado bajo implementación en el archivo .m:
- (id)init
{
self = [super init];
if (self != nil) {
[self commonInit];
}
return self;
}
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self != nil) {
[self commonInit];
}
return self;
}
-(instancetype)initWithCoder:(NSCoder *)aDecoder { //nib init
self = [super initWithCoder:aDecoder];
if (self != nil) {
[self commonInit];
}
return self;
}
@implementation MySegmentedControl
-(CGFloat) systemFontOfSize
{
return _systemFontOfSize ? _systemFontOfSize : 17.0f;
}
@end
Puede establecer el valor predeterminado y hacer la lógica predeterminada en la función commonInit si el objeto es una vista. Si no es vista, puedes hacerlo en la función init en mi opinión.