为什么我的函数不会改变我的外部变量的值?
问题描述:
我正在使用Xcode版本4.6。在我制作的iPhone和iPad应用程序中,我制作了一个名为dealCard的功能。那就是:为什么我的函数不会改变我的外部变量的值?
- (void)dealCard : (UIImageView *)cardImage : (int)card : (int)suit : (BOOL)aceBool : (int) cardValue : (int)total
{
suit = arc4random() % 4;
card = arc4random() % 13;
if (suit == 0)
{
//set images
if (suit == 1)
{
//set images
}
if (suit == 2)
{
//set images
}
if (suit == 3)
{
//set images
}
if (card < 10 && card != 0)
{
NSLog(@"Setting cardValue");
cardValue = card+1;
}
else if (card != 0)
{
NSLog(@"Setting cardValue");
cardValue = 10;
}
else
{
NSLog(@"Setting cardValue");
aceBool = YES;
if (total + 11 <= 21)
{
cardValue = 11;
}
else
{
cardValue = 1;
}
}
total = total + cardValue;
NSLog(@"Total = %d cardValue = %d",total,cardValue);
NSLog(@"playerTotal = %d playerCard3Value = %d",playerTotal,playerCard3Value);
}
进一步下跌的一页,我把:
[self dealCard: playerCard3Image : playerCard3 : playerSuit3 : playerCard3ace : playerCard3Value : playerTotal];
我的问题是在cardValue。输出显示“设置cardValue”,然后实例变量编号都是正确的,但其他两个都是错误的。 playerTotal读取此卡发放前的总数,并且playerCard3Value读数为0.要给你一些上下文,当第一张或第二张牌被发出时,而不是第三张和第二张牌被调用时,该函数被调用。前两个不在函数中处理。有谁知道为什么会发生这种情况?
答
面向对象的编程是一件很美的事情。编码这个真正的快速向你展示它是如何工作...
//
// PlayingCard.h
//
#import <Foundation/Foundation.h>
@interface PlayingCard : NSObject
- (id)initWithSuit:(NSInteger)suit value:(NSInteger)value;
- (BOOL)isAce;
- (BOOL)isFace;
@end
//
// PlayingCard.m
//
#import "PlayingCard.h"
@interface PlayingCard()
@property(nonatomic, assign) NSInteger suit;
@property(nonatomic, assign) NSInteger value;
@end
@implementation PlayingCard
- (id)initWithSuit:(NSInteger)suit value:(NSInteger)value {
self = [self init];
if (self) {
_suit = suit;
_value = value;
}
return self;
}
- (BOOL)isAce {
return self.value == 0;
}
- (BOOL)isFace {
return self.value > 10;
}
- (NSString *)suitName {
switch (self.suit) {
case 0:
return @"spades";
break;
case 1:
return @"diamonds";
break;
case 2:
return @"clubs";
break;
case 3:
return @"hearts";
break;
default:
return @"";
break;
}
}
// so it prints nicely. you should consider making the suits enums
- (NSString *)description {
return [NSString stringWithFormat:@"%@: suit:%@, value:%d", [super description], [self suitName], self.value];
}
@end
//
// CardDeck.h
//
#import <Foundation/Foundation.h>
@class PlayingCard;
@interface CardDeck : NSObject
+ (id)cardDeck;
- (void)shuffle;
- (NSUInteger)count;
- (PlayingCard *)dealOne;
@end
//
// CardDeck.m
//
#import "CardDeck.h"
#import "PlayingCard.h"
@interface CardDeck()
@property(nonatomic,strong) NSMutableArray *cards;
@end
@implementation CardDeck
+ (id)cardDeck {
CardDeck *deck = [[self alloc] init];
for (NSInteger suit = 0; suit < 4; suit++) {
for (NSInteger value = 0; value < 13; value++) {
PlayingCard *card = [[PlayingCard alloc] initWithSuit:suit value:value];
[deck.cards addObject:card];
}
}
return deck;
}
- (id)init {
self = [super init];
if (self) {
_cards = [NSMutableArray array];
}
return self;
}
- (void)shuffle {
NSMutableArray *shuffledCards = [NSMutableArray array];
for (int i=0; i<52; i++) {
int randomIndex = arc4random_uniform(52-i);
[shuffledCards addObject:[self.cards objectAtIndex:randomIndex]];
[self.cards removeObjectAtIndex:randomIndex];
}
self.cards = shuffledCards;
}
- (NSUInteger)count {
return self.cards.count;
}
- (PlayingCard *)dealOne {
PlayingCard *card = [self.cards lastObject];
[self.cards removeLastObject];
return card;
}
@end
这样称呼它......
CardDeck *deck = [CardDeck cardDeck];
// try it with and without shuffle
[deck shuffle];
while (deck.count) {
PlayingCard *card = [deck dealOne];
NSLog(@"%@", card);
}
请问这是由于变量的范围是什么? – PsyKzz 2013-03-06 23:49:38
@Matt PsyK - 如何让他们成为全球?我只是在.h文件中声明它们:'int playerCard3Value;' – 2013-03-06 23:52:58
不幸的是,我不知道obj-c或xcode足以发表评论。 – PsyKzz 2013-03-06 23:56:46