0

ここで剃られないことを願っています!モデルクラス内のメソッドを呼び出して、呼び出し元のコントローラーにオブジェクトを返そうとします。

私のAppDelegate.h:

#import <Cocoa/Cocoa.h>
@class ResultItem;

@interface AppDelegate : NSObject <NSApplicationDelegate>{
    ResultItem *ri;
}
-(void)calculateResults;
@end

私のAppDelegate.m:

#import "AppDelegate.h"
#import "ResultItem.h"

@implementation AppDelegate
    //other stuff

- (void)calculateResults{
    self->ri = [[ResultItem alloc]init];         //ResultItem is my model
    [xx calculateUniformDistribution:(double)x1
            withxMinus:(double)x2
            withxAvg:(double)x3
            withCount:(double)numberCounter];
} ...

私のResultItem.h

#import <Foundation/Foundation.h>
@interface ResultItem : NSObject

-(NSMutableDictionary *)calculateUniformDistribution:(double)xPlus
        withxMinus:(double)xMinus
        withxAvg:(double) xAvg
        withCount:(int) count;

私のResultItem.m

#import "ResultItem.h"
@implementation ResultItem

- (NSMutableDictionary *)calculateUniformDistribution:(double)xPlus
        withxMinus:(double)xMinus
        withxAvg:(double)xAvg
        withCount:(int)count{

NSMutableArray *dimensionRandomArray = [[NSMutableArray alloc] init];
NSMutableDictionary *newResultItem = [[NSMutableDictionary alloc]init];

//calculation loop

[newResultItem setValue:[NSNumber numberWithDouble:max] forKey:@"maxValue"];
[newResultItem setValue:[NSNumber numberWithDouble:min] forKey:@"minValue"];
[newResultItem setValue:[NSNumber numberWithDouble:avg] forKey:@"averageValue"];
[newResultItem setValue:dimensionRandomArray forKey:@"randomValueArray"];

return newResultItem;
}

ResultItemメソッドはfineと呼ばれます。NSMutableDictionary後でAppDelegateで処理する必要のあるオブジェクトを作成したいと思います。

私の質問:

  1. 後でメソッドnewResultItem内にアクセスするにはどうすればよいですか。AppDelegate
  2. メソッドnewResultItem内にキーを使用して値を追加する方法がわかりません。誰かが私を助けてくれますか?AppDelegatecalculateResults
  3. newResultItemオブジェクトの実際の所有者は誰ResultItemですかAppDelegate
  4. このようにコードを設定するのは間違っているように見えますか?私は可能な限りMVCパターンに従うようにしています。

私を殴らないでください...

4

2 に答える 2

1

理想的には、ResultsItemはプロパティのみをカプセル化し、計算メソッドはカプセル化しないようにする必要があります。これは簡単な例です(値を追加するには、次のような辞書を使用できます)。

   @implementation  ResultItem  
   @synthesize max, min, ...;     
   - (id)initWithDictionary:(NSDictionary*)dictionary {
      if ((self = [super init])) {
          self.max = [dictionary objectForKey:@"maxValue"];
          self.min = [dictionary objectForKey:@"minValue"];
          ......
                     }
      return self; 
    }
    @end

次に、すべての計算メソッドを実行するCalculationクラスを作成し、次のようにResultItemオブジェクトを作成します。

ResultItem *resultItem = [[ResultItem alloc] initWithDictionary:yourDictionary];

このオブジェクトをAppDelegateに返します。

于 2013-02-26T22:37:42.417 に答える
0

まず、ResultItemクラスを削除することをお勧めします。代わりに、コントローラークラスのメソッドに置き換えます。この場合、calculateUniformDistributionメソッドをAppDelegateに移動します。または、少なくともcalculateUniformDistributionを適切なModelクラス(アプリが車、バス、飛行機を処理している実際のオブジェクト)に移動します。

実際に辞書を返し、値を追加することに関して、現在のパターンに固執すると仮定した場合の単純化された例を次に示します。

AppDelegate.mで

self.ri = [[ResultItem alloc] init];
NSMutableDictionary* dict = [self.ri calculateUniformDistribution:(double)x1
        withxMinus:(double)x2
        withxAvg:(double)x3
        withCount:(double)numberCounter];
[dict setValue:[NSNumber numberWithDouble:1.0] forKey:@"additionalKey"];

ResultItem.mで

NSMutableArray* dimensionRandomArray = [[NSMutableArray alloc] init];
NSMutableDictionary* returningDict = [[NSMutableDictionary alloc] init] autorelease];

//calculation loop

[newResultItem setValue:[NSNumber numberWithDouble:max] forKey:@"maxValue"];
[newResultItem setValue:[NSNumber numberWithDouble:min] forKey:@"minValue"];
[newResultItem setValue:[NSNumber numberWithDouble:avg] forKey:@"averageValue"];
[newResultItem setValue:dimensionRandomArray forKey:@"randomValueArray"];
[dimensionRandomArray release];

return newResultItem;

returnDictの自動リリースとdimensionRandomArrayのリリースに注意してください。また、後でself.riをリリースする必要があります。また、AppDelegateでディクテーションを維持したい場合は、retain-releaseを追加する必要があります。

于 2013-02-26T22:37:28.613 に答える