0

我有一个简单的数据模型(核心数据),但这里是它的精简版:

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

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

我想获得一个帐户的总余额,但是,我不想将借记标记为负数。我只是希望它是一个借记类型的金额。

目前,在我添加借方之前,我可以通过 Account 中的此功能获取余额:

- (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 回答