iOS转换器应用程序,措施之间的连接

我想知道如果有人能帮助我如何使措施之间的联系,例如我怎样才能计算厘米和英寸之间的关系,如图片。 这是我的学校项目的应用程序,除了那一部分,它或多或less是做的。 所以我正在阅读plist的价值观,并根据我的第一列select器,第二和第三显示。 所有单位和措施从plist读取。 以能量,距离,音量等为关键。

那么,在措施之间build立联系最简单的方法是什么? 我最简单也是最有业余爱好的想法是编写懒惰的代码,如下所示:

if (first column == distance){ if (second column ==millimeter) { case 0: if (third column == millimeter) then result=x*1; case 1:if (third column == centimeter) then result=0/100; . . . } if (second column == centimeter){ case 0: case 1: . . . }} 

这将导致1000行不必要的代码。 有没有人有更好的主意? 提前致谢。

整个事情可以用数据完成, if没有,就不需要switch ……只需要组织一点点。 考虑以下:

 @property (strong, nonatomic) NSArray *distanceIndex; @property (strong, nonatomic) NSArray *weightIndex; @property (strong, nonatomic) NSArray *distanceConversion; @property (strong, nonatomic) NSArray *weightConversion; - (void)initConversions { // we get strings in as our units, so we need to convert these to array indexes // make up our own convention, meters=0, inches=1, etc self.distanceIndex = @[@"meters", @"inches", @"miles"]; self.weightIndex = @[@"grams", @"ounces", @"pounds"]; // you might read these from a file, but in code, just to illustrate... // the order follows the order of the index. so the meters line is first // and the conversion factors are meters->meters, meters->inches, meters->miles etc. // notice the 1.0's on the diagonal, and that numbers reflected across // the diagonal are reciprocals self.distanceConversion = @[ @[@"meters", @[@1.0, @39.37, @0.000621]], @[@"inches", @[@0.254, @1.0, @0.00001578]], @[@"miles ", @[@1609.0, @63360.0, @1.0]] ]; // and so on... same thing for self.weightConversions } - (double)convertDistance:(double)value from:(NSString *)fromUnits to:(NSString *)toUnits { NSUInteger fromIndex = [self.distanceIndex indexOfObject:fromUnits]; NSUInteger toIndex = [self.distanceIndex indexOfObject:toUnits]; // throw an exception if passed units that we don't recognize NSAssert(fromIndex != NSNotFound && toIndex != NSNotFound, @"could not find units"); NSArray *conversionRow = self.distanceConversion[fromIndex][1]; NSNumber *conversionNumber = conversionRow[toIndex]; double conversion = [conversionNumber doubleValue]; return value * conversion; } - (double)convertWeight:(double)value from:(NSString *)fromUnits to:(NSString *)toUnits { // same idea here, if you have the weight conversion data return 0; } 

如果我要写这个,我会这样做:

对于每种types的转换(我将使用距离作为例子)首先select一个标准单位(我正在采摘米)现在转换每个单位米,并将其保存到数据库(或arrays,plist,无论)。

例如cm:0.1,km:1000等

然后,对于您需要进行的每次转换,只需取两者的转换数字,使用第一个转换input为米,然后使用第二个转换为输出。

例如:5厘米到5公里,5 * 0.1 = 0.5米。 0.5 / 1000 = 0.0005公里。

这就是我将如何处理这个问题

你可能想采取面向对象的方法。

有一个基本的抽象类或接口,可以容纳两个UnitType单位。 它有两个属性FromUnitToUnit和一个名为Convert:的方法。

还有另外一个叫Unit的抽象类。 这将有两个方法ConvertToStanard:amountConvertFromStandard:amount这将转换为每种types的标准单位,说最低单位。

所以你的MeterUnit看起来像这样

 @implementation MeterUnit -(double) ConvertToStandard:(double) amount { return amount/100; } -(double) ConvertFromStandard:(double) amount { return amount*100; } @end 

而你的厘米单位将返回金额(已经在厘米)。

 @implementation CentimeterUnit -(double) ConvertToStandard:(double) amount { return amount; } -(double) ConvertFromStandard(double) amount { return amount; } @end 

现在你的UnitType的Convert()方法看起来就像这样,因为每个子类都定义了标准单元的热点,所以你的DistanceUnitType类不知道或者关心它是如何完成的。 它只知道调用ConvertToStandard和ConvertFromStandard :.

 -(double) Convert:(double) amount { double stanardUnit = [FromUnit ConvertToStandard:amount]; return [ToUnit ConvertFromStandard:standardUnit]; } 

UnitType也可以定义可用的单位并将其提供给UIPicker。

事实上,你可以在你的每个单元的类上拥有两个属性,只需要你的基类调用标准函数。

为什么这更好? 也许不是,但至less你只是定义每个单位一次。 在嵌套的if / case语句中,你需要定义每个转换一堆。 另外如果你想添加一个新的,你需要在switch语句中创build一堆新的条目。 但在这种情况下,您只需定义一个类,并将其添加为UnitType的可用单位。 而已!

无论如何,我确定有很多错误和问题,但是如果这是一个类项目,那么可能是很好的,如果是这样的话。 希望能给出一个解决这个问题的方法。