使用矩阵进行单位转换是一种不好的方法。
选择一个“基本单元”。例如,如果您要转换长度单位,请选择米作为基本单位。
创建一个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];
}