使用矩陣進行單位換算是一種很好的方法。
選擇一個「基本單位」。例如,如果您要轉換長度單位,請選擇米作爲您的基本單位。
創建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];
}
數組和矩陣有* integer *指數,我不明白你爲什麼使用* float *。 - 你上一個語句的語法是完全錯誤的。矩陣的一個元素用'matrix [from] [to]'(其中'from'和'to'是你的情況下0到4範圍內的整數)來訪問。 –
正是我們想要的!你能解釋我們如何做到這一點? –
'_convertRates'似乎已經是每個單元都有轉換因子的數組。爲什麼你需要矩陣呢? –