Alec
Alec

Reputation: 979

Can't Add Object to NSMutableArray

I have a class called KCBlackjack. The class contains this code:

playerHand = [[NSMutableArray alloc] init];
dealerHand = [[NSMutableArray alloc] init];

blackjack = [[KCBlackjack alloc] initWithNumberOfDecks:6];
[self deal];

[blackjack dealTo:playerHand dealer:dealerHand];

- (void)dealTo:(NSMutableArray *)player dealer:(NSMutableArray *)dealer {
    // How many cards are left
    NSLog(@"Cards in Deck: %d", [_decks count]);

    // Deal to player then dealer
    for (int i = 0; i <= 1; i++) {
        [player addObject:[_decks lastObject]];
        [_decks removeLastObject];

        NSLog(@"%@", player);

        if(_delegate && [_delegate respondsToSelector:@selector(didDistributeCard:withValue:)]) {
            KCCard *aCard = (KCCard *)[player objectAtIndex:player.count-1];
            [_delegate didDistributeCard:aCard to:player withValue:[aCard value]];
        }

        [dealer addObject:[_decks lastObject]];
        [_decks removeLastObject];

        NSLog(@"%@", dealer);

        if(_delegate && [_delegate respondsToSelector:@selector(didDistributeCard:withValue:)]) {
            KCCard *aCard = (KCCard *)[dealer objectAtIndex:dealer.count-1];
           [_delegate didDistributeCard:aCard to:dealer withValue:[aCard value]];
        }
    }

    NSLog(@"Done Dealing");

    NSLog(@"Cards Remaining in Deck: %d", [_decks count]);

    NSLog(@"Player: %@\n\n", player);
    NSLog(@"Dealer: %@\n\n", dealer);
}

Inside of my game controller, I set player to my player array as well as the dealer his. When this is run however, it doesn't work. No objects are added to the player array that player or dealer is assigned.

When the code is in the game controller, it works, but not in this class. I figure something is not initializing, but in the game controller, the player and dealer are both initialized.

Upvotes: 0

Views: 222

Answers (1)

Damien Del Russo
Damien Del Russo

Reputation: 1048

If you think of it from a OO perspective, dealer and player are really objects that should receive a message such as addCardToHand:(Card )aCard. The way you are doing it, Lucas has exactly right, you get a copy of his array which is not mutable. I'd much rather see some dot notation such as player.hand addCard:(Card)aCard if you don't want the player to handle the card himself (watch for card sharps! :-) ).

I think if you refactor with objects you can have clean code that works, and probably get rid of that delegation stuff (which is a bit confusing just reading).

Good luck - blackjack is fun!

Damien

Upvotes: 1

Related Questions