1

「カード」を保持するための NSMutableArray* cardSet を含む「CardSet」というクラスがあり、これを拡張して「DeckCards」を作成します。「CardSet」に「(void)addCard:(Card*)」というメソッド (および同様に「removeCard」メソッド) が必要です。カードセットにアクセスして設定する方法に「addCard」を追加したいと思います。さらに良いのは、「addCard」メソッドを使用して cardSet を初期化することです。クラスファイル「CardSet.h」は次のとおりです。

 #import < Cocoa/Cocoa.h >

 #import < Card.h >

@interface CardSet : NSObject {

    NSMutableArray* cardSet;

}

-(id)init;

-(NSMutableArray*)getCardSet;

-(void)setCardSet:(NSMutableArray *)new_cardset;

-(Card*)getCard:(NSInteger) index;

**-(void)addCard:(Card*) new_card;**

-(void)removeCard:(Card*) old_card;

-(void)dealloc;

@property (readwrite, retain, getter=getCardSet, setter=setCardSet) NSMutableArray* cardSet;

@end

メソッドファイルには次のように書かれています。

 #import "CardSet.h"

@implementation CardSet

-(id)init{
    if( self = [super init] ){}   //will add initialisations here later
    return self;
}

-(NSMutableArray*)getCardSet{
    return cardSet;
}

-(void)setCardSet:(NSMutableArray *)new_cardSet{
    cardSet = new_cardSet;
}

-(Card*)getCard:(NSInteger)index{
    return [cardSet objectAtIndex:index];
}

**-(void)addCard:(Card *)new_card{
    [cardSet addObject:new_card];
}**

-(void)removeCard:(Card *)old_card{
    [cardSet removeObject:old_card];
}

-(void)dealloc{
    [cardSet release];
    [super dealloc];
}

@synthesize cardSet;

@end

これは問題なくコンパイルされます。「addCard」メソッドを 52 回使用して「DeckCards」インスタンスを初期化したいと思います。DeckCards セッター メソッドで addCard を 52 回呼び出し、その「cardSet」のサイズを要求すると、0 が返されます。

これはスコープまたは特権の問題のように見えますか? 「addCard」メソッドにセッター権限を与えることはできますか? セッター引数は、戻り値およびそれぞれのメンバー型と同じでなければなりませんか?

[「DeckCard」の外側に NSMutableArray オブジェクト「deck_cards_temp」を作成し、これに 52 枚のカードを追加して、「CardSet」から継承されたセッターを介して「DeckCards」インスタンスのメンバーを設定するために渡すことで、上記の問題を回避できます。これはあまり満足のいくものではありません!]

何をアドバイスしますか?ご理解とご協力をよろしくお願いいたします。

4

3 に答える 3

3

実際にcardSetオブジェクトを作成することはありません。メソッドで作成する必要があります-init

-(id)init
{
    if( self = [super init] )
    {
        cardSet = [[NSMutableArray alloc] init];
    }
    return self;
}

実際に配列を作成することはないため、への呼び出しはすべて-addCard:nil オブジェクトに送信されます。

に配列を-setCardSet:渡すと、初期化された配列が渡されるため、配列は nil ではなくなり、-addCard:呼び出しは正常に機能します。

于 2010-03-01T01:53:41.773 に答える
0

そのinitメソッドを短くします:

- (id)init {
    if (self = [super init]) {
        // If we don't create the cardSet, how are we able to work with it!?
        self.cardSet = [NSMutableArray array];
    }
    return self;
}
于 2010-03-01T16:33:41.517 に答える
0

CardSet.h

#import <Cocoa/Cocoa.h>

// For know we just need to know there is a class named "Card" being used but implemented later
@class Card;

@interface CardSet : NSObject {
    NSMutableArray *cardSet;
}

// Here are the methods according to "correct" naming conventions
- (Card *)cardAtIndex:(NSInteger)index;
- (void)addCard:(Card *)card;
- (void)removeCard:(Card *)card;

// This will help us and forget about writing the setter/getter
@property (nonatomic, retain) NSMutableArray *cardSet;

@end

CardSet.m

#import "CardSet.h"
// Now we tell the compiler what "Card" is and what methods etc. it has
#import "Card.h"

@implementation CardSet

@synthesize cardSet;

- (id)init {
    if (self = [super init]) {
        // If we don't create the cardSet, how are we able to work with it!?
        NSMutableArray *anArray = [[NSMutableArray alloc] init];
        self.cardSet = anArray;
        [anArray release];
    }
    return self;
}

- (Card *)cardAtIndex:(NSInteger)index {
    return [cardSet objectAtIndex:index];
}

- (void)addCard:(Card *)card {
    [cardSet addObject:card];
}

- (void)removeCard:(Card *)card {
    [cardSet removeObject:card];
}

- (void)dealloc {
    [cardSet release];
    [super dealloc];
}

@end

Abizernが既に述べたように: 配列にクラスと同じ名前を付けることは悪いことです

于 2010-03-01T13:23:37.713 に答える