逻辑/iOS-根据用户是否输入覆盖某些值
我正在寻找一种正确执行以下操作的方法 我在一个对象中有多个给定默认值的值(一些是物理数字,另一些是计算值)。用户选择几个参数,其余参数将为它们填充 填充值后,用户可以覆盖其选择的任何值,这可能会导致重新计算值。如果该值是用户输入的计算值,我不希望它更改 以以下为例:逻辑/iOS-根据用户是否输入覆盖某些值,ios,logic,Ios,Logic,我正在寻找一种正确执行以下操作的方法 我在一个对象中有多个给定默认值的值(一些是物理数字,另一些是计算值)。用户选择几个参数,其余参数将为它们填充 填充值后,用户可以覆盖其选择的任何值,这可能会导致重新计算值。如果该值是用户输入的计算值,我不希望它更改 以以下为例: Class values { NSString *userSelected: double value1; double value2; double value3; double calc1
Class values {
NSString *userSelected:
double value1;
double value2;
double value3;
double calc1;
double calc2;
double calc3;
}
然后用户(从选择器中)选择值。userSelected
。选择后,值1-3和计算值1-3将分配/计算到其“默认值”
然后用户可以进入并编辑say value1。一旦更改,calc1-3将重新计算是否使用值1。现在,用户还可以覆盖计算值。因此,如果用户覆盖calc1,然后更改值1,我不希望calc1再次更改,因为它是由用户更改的
我想到的一种方法是用默认值复制每个值,如果设置了非默认值,则返回该值:
即
因此,如果设置了非默认值,则使用该值,否则使用默认值。这似乎是一种低效的做法。有没有人对如何做到这一点有更好的想法。我的类大约有20个属性,所以我不希望每个变量需要2个属性。我是用iOS编程的,但这更像是一个方法论问题,而不是一段特定的代码。如果有任何不清楚的地方,请随时询问
谢谢,
DMan有一件事可以满足您的需求:。基本上,您可以使用
@property
语法在类中声明一组值,然后在实现中执行一些操作,包括重写getter/setter。例如:
//in MyClass.h
@interface MyClass : NSObject
@property (nonatomic, assign) double value1;
@property (nonatomic, assign) double calc1;
@end
//in MyClass.m
@implementation MyClass {
BOOL _calc1Changed;
}
//you should default that flag to NO, so...
- (id)init {
_calc1Changed = NO;
}
- (void)setValue1:(double)newValue1 {
if (!_calc1Changed) [self calculateCalc1]; //define this calculation also in this file
value1 = newValue1; //value1 is the synthesized ivar for the property you declared
}
当然,您需要在某个地方调用
\u calc1Changed=YES
每当用户手动设置calc1
时,可能以类似构造的覆盖方式。基本上,每次调用myClassInstance.value1=something
或[myClassInstance setValue1:something]
时,都会执行这些检查,并且可以执行额外的功能来验证/响应输入。Hmm非常类似于使用两个属性来跟踪值。我想,似乎没有一种方法可以在没有标志或辅助变量的情况下真正跟踪这一点。我猜这两种方法都会为未计算的值保存一个属性/标志,并允许它们自由更改,并且只需要跟踪计算值。我怀疑任何更干净的方法(不使用某种标志)都是特定于计算的。即,它将取决于如何计算calc1
的值;例如,如果calc1
只是value1/value2
,则在覆盖中,您可以将calc1
的值与value1
和value2
的旧值进行比较,如果它实际上不是value1/value2
,则必须手动调整它。但是,如果calc1
的计算与可能的value1,2
值的汇合不是1:1,则您可能无法做到这一点。
//in MyClass.h
@interface MyClass : NSObject
@property (nonatomic, assign) double value1;
@property (nonatomic, assign) double calc1;
@end
//in MyClass.m
@implementation MyClass {
BOOL _calc1Changed;
}
//you should default that flag to NO, so...
- (id)init {
_calc1Changed = NO;
}
- (void)setValue1:(double)newValue1 {
if (!_calc1Changed) [self calculateCalc1]; //define this calculation also in this file
value1 = newValue1; //value1 is the synthesized ivar for the property you declared
}