0

私は単純なデータ モデル (コア データ) を持っていますが、これを簡略化したバージョンを次に示します。

Account
----------------------------------------------------
NSSet<Transaction> transactions

Transaction
----------------------------------------------------
Account  account
NSNumber amount
NSNumber type ( type ∈ ( 0->'Credit', 1->'Debit' ) )

アカウントの合計残高を取得したいのですが、借方を負の数としてマークしたくありません。借方の種類のある金額にしたいだけです。

現在、借方を追加する前に、アカウントでこの関数を使用して残高を取得できました。

- (NSNumber *)currentBalance
{
    return [self.transactions valueForKeyPath:@"@sum.amount"];
}

明らかに、それは借方をマイナスにした場合にのみ機能します。おそらくセットをクレジットとデビットにフィルタリングし、それらを合計して差を実行するためのエレガントなソリューションはありますか? それで精度が保てますか?NSPredicate を調べましたが、正確にどのように進めればよいかわかりません。

4

1 に答える 1

0

これが私の研究が私を導いたものです:

- (NSNumber *)currentBalance
{
    // credits
    NSPredicate *creditPredicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
        return [((Transaction *)evaluatedObject).type intValue] == kTransactionTypeCredit;
    }];

    NSSet *credits = [self.transactions filteredSetUsingPredicate:creditPredicate];

    NSDecimalNumber *totalCredits = [credits valueForKeyPath:@"@sum.amount"];

    // debits
    NSPredicate *debitPredicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
        return [((Transaction *)evaluatedObject).type intValue] == kTransactionTypeDebit;
    }];

    NSSet *debits = [self.transactions filteredSetUsingPredicate:debitPredicate];

    NSDecimalNumber *totalDebits = [debits valueForKeyPath:@"@sum.amount"];

    // do the math
    return [totalCredits decimalNumberBySubtracting:totalDebits];
}

機能している間は、過剰な量の作業のようです。それは最善の方法ですか?

于 2012-09-19T02:10:38.527 に答える