2014-01-24 28 views
0

我在想如果有人能帮助我如何使措施之间的联系,例如我怎样才能计算厘米和英寸之间的关系,如图片。这是我的学校项目应用程序,除了那个部分之外,它或多或少都已经完成。所以我正在阅读plist的值,并根据我的第一列选择器显示第二和第三列。所有的单位和措施都是从plist中读取的。以能量,距离,音量等为关键。iOS转换器应用程序,措施之间的联系

那么什么是使措施之间的连接最简单的方法?我最容易和最业余的想法是编写loooong代码,如下所示:

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行不必要的代码。有没有人有更好的主意?提前致谢。

回答

1

整个事情可以用数据完成,没有if s,没有switch es ......它只是需要组织一点点。考虑以下几点:

@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; 
} 
+0

谢谢!很有帮助。 – user3194296

1

如果我写这一点,我这样做:

对于每种类型的转换(我要使用距离作为例子) 首先选择一个标准单元(I米采摘表) 现在把每个单位转换为米,并将其保存到数据库(或阵列,plist,无论)。

例在每平方厘米:0.1公里:1000等

然后为每个需要做,只取两者的转换次数,使用第一个输入转换为米,并转换为转换使用第二个输出。例如:5公分到5公里,5 * 0.1 = 0.5公尺。 0.5/1000 = 0.0005公里。

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

+0

谢谢,这是一个很好的方法,但我怎么看待使用哪种措施?再次,我会需要很多如果和案例,看看写在第二和第三列 – user3194296

1

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

有一个基本的抽象类或接口,它可以包含两个称为UnitType的单元。 它将具有2个属性FromUnitToUnit,和被叫Convert:方法。

也有另一个名为单位抽象类。 这将有两种方法ConvertToStanard:amountConvertFromStandard:amount 这将转换为每种类型的标准单位,说最低单位。

所以你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的转换()方法只是看起来是这样,因为每个子类定义热去/从标准单位,您DistanceUnitType类并不知道也不关心它是如何做。它只知道调用ConvertToStandard和ConvertFromStandard :.

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

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

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

为什么这更好?也许不是,但至少你只是定义每个单位一次。在嵌套的if/case语句中,您需要定义每个转换很多次。另外如果你想添加一个新的,你需要在switch语句中创建一堆新条目。但在这种情况下,您只需定义一个类并将其添加为UnitType的可用单位。而已!无论如何,我确信有很多错误和问题,但如果这是一个类项目,它可能很好,如果是这样的话。希望它能提供一个解决这个问题的方法。