3

我回来了我的转换器应用程序问题。正如互联网清楚地告诉我使用 if-else 进行转换很糟糕,我试图获取矩阵的数据。这是我的尝试;

float convertFrom = [[_convertRates objectAtIndex:[pickerView selectedRowInComponent:0]] floatValue];
float convertTo = [[_convertRates objectAtIndex:[pickerView selectedRowInComponent:1]] floatValue];
float input = [inputText.text floatValue];
float to = convertTo;
float from = convertFrom;
float convertValue = input;


int matrix [5] [5] = {
    {1,2,3,4,5},
    {2,4,6,8,10},
    {3,6,9,12,15},
    {4,8,12,16,20},
    {5,10,15,20,25}};




NSString *MTPA = [[NSString alloc ] initWithFormat:
                         @" %i %i ", matrix [[%f][%f], from, to]];

所以我想要这段代码做的是获取当前在 UIPickerWheel 中的单位的值,将其用作从 int 中获取的数字的坐标,然后放入浮点数中进行计算。这只是一个测试,看看它是否有效。是否不可能将浮点数用作矩阵的坐标,还是我做错了?

4

1 回答 1

3

使用矩阵进行单位转换是一种不好的方法。

选择一个“基本单元”。例如,如果您要转换长度单位,请选择米作为基本单位。

创建一个UnitDefinition包含单位名称和转换因子的结构,以将该单位转换为基本单位:

typedef struct {
    unsigned long long toFundamentalUnitNumerator;
    unsigned long long toFundamentalUnitDenominator;
    __unsafe_unretained NSString *unitName;
} UnitDefinition;

然后创建一个包含您要支持的单位的数组:

static UnitDefinition unitDefinitions[] = {
    { 1, 1000000, @"micron" },
    { 1, 1000, @"millimeter" },
    { 1, 100, @"centimeter" },
    { 1, 10, @"decimeter" },
    { 1, 1, @"meter" },
    { 10, 1, @"decameter" },
    { 100, 1, @"hectometer" },
    { 1000, 1, @"kilometer" },
    { 1000000, 1, @"megameter" },
    { 254, 10000, @"inch" },
    { 9144, 10000, @"yard" },
    { 160934, 100, @"mile" }
};

您还需要一个常数来表示数组中的单元数:

#define kUnitDefinitionCount (sizeof unitDefinitions / sizeof *unitDefinitions)

现在您可以UIPickerViewDataSource像这样实现协议:

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
    return 2;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    return kUnitDefinitionCount;
}

你可以UIPickerViewDelegate像这样实现协议:

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    return unitDefinitions[row].unitName;
}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
    [self updateResultView];
}

你可以updateResultView这样实现:

- (void)updateResultView {
    UnitDefinition *fromUnit = &unitDefinitions[[unitsPicker_ selectedRowInComponent:0]];
    UnitDefinition *toUnit = &unitDefinitions[[unitsPicker_ selectedRowInComponent:1]];

    double input = inputField_.text.doubleValue;
    double result = input
        * fromUnit->toFundamentalUnitNumerator
        * toUnit->toFundamentalUnitDenominator
        / fromUnit->toFundamentalUnitDenominator
        / toUnit->toFundamentalUnitNumerator;
    resultLabel_.text = [NSString stringWithFormat:@"%.6g", result];
}
于 2012-10-16T17:58:18.520 回答