0

Apple の Key Value Programming Guide を読んでいます。トピック「単純なコレクション演算子」で、私は次のように読みました。

次の例は、トランザクション内のオブジェクトのトランザクション金額の平均値を返します。

上記を使用できるプログラムを作成しようとしています。以下は、そのプログラムのファイルです。上記がうまくいかない理由を理解できません。

トランザクション.h

    #import <Foundation/Foundation.h>

@interface Transaction : NSObject
{
NSString *payee;
NSNumber *amount;
NSDate *date;
}
- (void) setPayee: (NSString *) aP 
    setAmount: (NSNumber *) aN
      setDate: (NSDate *) aD;

@end

Transaction.m #import "Transaction.h"

@implementation Transaction
- (void) setPayee: (NSString *) aP 
    setAmount: (NSNumber *) aN
      setDate: (NSDate *) aD 
{
payee = aP;
amount = aN;
date = aD;
} 
@end

TransactionDataBase.h

#import <Foundation/Foundation.h>
#import "Transaction.h"
@interface TransactionDataBase : NSObject
{
NSMutableArray *tArray;
}
  - (id) objectInTArrayAtIndex: (NSUInteger) index;
- (void) insertObject: (Transaction *) tA
inTArrayAtIndex: (NSUInteger) index;
  - (NSUInteger) countOfTArray;
  @end

TransactionDataBase.m

     #import "TransactionDataBase.h"

   @implementation TransactionDataBase
  - (id) init
  {
self = [super init];
if (self) {
    tArray = [[NSMutableArray alloc] initWithCapacity:40];
   }
    return self;
  }

    - (id) objectInTArrayAtIndex: (NSUInteger) index
  {
  return [tArray objectAtIndex:index];
  }

  - (void) insertObject: (Transaction *) tA
    inTArrayAtIndex: (NSUInteger) index
 {
[tArray insertObject:tA atIndex:index];
   }

 - (NSUInteger) countOfTArray
  {
return [tArray count];
    }
   @end


  main.m:


  #import <Foundation/Foundation.h>
    #import "Transaction.h"
   #import "TransactionDataBase.h"

    int main(int argc, const char * argv[])
   {

      @autoreleasepool {

    Transaction *t1 = [[Transaction alloc] init];
    Transaction *t2 = [[Transaction alloc] init];
    Transaction *t3 = [[Transaction alloc] init];

    NSDate *nowDate = [[NSDate alloc]  initWithString:@"2.4.2012"];
    NSDate *nowDate2 = [[NSDate alloc] initWithString:@"2.4.2012"];
    [t1 setPayee:@"c" setAmount:[NSNumber numberWithInt:3000] setDate:nowDate];

    [t2 setPayee:@"c" setAmount:[NSNumber numberWithInt:5000] setDate:nowDate2];


    [t3 setPayee:@"y" setAmount:[NSNumber numberWithInt:1000] setDate:nowDate2];

    TransactionDataBase *db1 = [[TransactionDataBase alloc] init];
    [db1 insertObject:t1 inTArrayAtIndex:0];
    [db1 insertObject:t2 inTArrayAtIndex:1];
    [db1 insertObject:t3 inTArrayAtIndex:2];
    NSNumber *avgT = [db1 valueForKeyPath: "@avg.amount"];
    NSLog(@"%@", avgT);


}
return 0;
  }
4

2 に答える 2

0

クラスTransactionDataBaseは、格納している値を含む配列を返すキー パスをサポートする必要があります。また、Transactionクラスは key のキー値コーディングをサポートする必要があります@"amount"。これらのクラスに適切なプロパティを追加する必要があります。

で使用するキー パスは[db1 valueForKeyPath: "t1.@avg.amount"]、これらのプロパティの名前を考慮に入れる必要があります。つまり、現在のコードでは、 の項目の配列はTransactionDataBasekey を介してアクセスできる必要があります@"t1"

于 2012-04-20T15:49:29.663 に答える
0

NSNumber *avgT = [db1 valueForKeyPath:@"@avg.amount"]; が必要だと思います。t1 オブジェクトだけでなく、配列内のすべての「金額」値を平均したい - 1 つの値を平均しても意味がありません。

于 2012-04-20T15:51:25.417 に答える