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から取得する数値の座標として使用し、後で計算のためにfloatに入れることです。これは、それが機能するかどうかを確認するための単なるテストです。行列の座標としてfloatを使用することは不可能ですか、それとも間違っていますか?

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 に答える