2012-04-20 7 views
0

私はAppleのKey Value Programming Guideを読んでいます。トピックで は、シンプルなコレクション演算子は、私が読んで:シンプルなコレクションオペレータの理解

次の例では、トランザクション内のオブジェクトのトランザクション量の平均値を返します。 NSNumber* transactionAverage = [取引valueForKeyPath:「@のavg.amount」] ;

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

Transaction.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; 
    } 

答えて

0

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

+0

はい、あなたは正しいです。私は今私の投稿を編集しました。 – Rounak

+0

しかし、それを動作させる方法は? – Rounak

+0

「どのように動作させるか」とはどういう意味ですか?それが今働いていないなら、何が起こっていますか?エラーが発生していますか? – rdelmar

0

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

[db1 valueForKeyPath: "[email protected]"]で使用するキーパスは、これらのプロパティの名前を考慮する必要があります。すなわち、現在のコードでは、の項目の配列には@"t1"のキーでアクセスできる必要があります。

関連する問題