对象仅在Obj - C中的if语句中可用吗?

时间:2014-06-25 21:33:53

标签: ios objective-c

可能是一个简单的问题......我是一名初学程序员,所以请耐心等待:) 我已经创造了我的第一个真实的'从甲板上抽取卡片直到抽出小丑的iPhone应用程序,然后游戏就结束了。

到目前为止,这么好并且一切正常,除了我必须使用我真正讨厌的解决方法。 我的Deck对象仅在我声明它的地方可用,这似乎正常但令人恼火。

基本上,每次用户点击" Draw Card"时,我都必须制作一个全新的牌组。按钮...

- (IBAction)drawCard:(id)sender {
    Deck *deck = [[Deck alloc]init];
    deck.generate;
    unsigned int randomIndex = arc4random_uniform(deck.deckArray.count);
    Card *topCard = [deck.deckArray objectAtIndex:randomIndex - 1];
    if (topCard.value == 11) {
        NSString *cardInfo = [NSString stringWithFormat:@"You drew a Jack of %@", topCard.suit];
        self.cardDrawn.text = cardInfo;
    }else if (topCard.value == 12) {
        NSString *cardInfo = [NSString stringWithFormat:@"You drew a Queen of %@", topCard.suit];
        self.cardDrawn.text = cardInfo;
    }else if (topCard.value == 13) {
        NSString *cardInfo = [NSString stringWithFormat:@"You drew a King of %@", topCard.suit];
        self.cardDrawn.text = cardInfo;
    }else {
        NSString *cardInfo = [NSString stringWithFormat:@"You drew a %d of %@", topCard.value, topCard.suit];
        self.cardDrawn.text = cardInfo;
    }
    [deck removeCard];
    if (topCard.value == 14) {
        self.cardDrawn.text = @"You drew the Joker Bomb!";
        //Destroy deck
        deck = nil;
        [drawCard setEnabled:NO];
        [playAgain setEnabled:YES];
        [playAgain setHidden:NO];
    }

}


- (IBAction)playAgain:(id)sender {
    self.cardDrawn.text = nil;
    [drawCard setEnabled:YES];
    [playAgain setEnabled:NO];
    [playAgain setHidden:YES];
}

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self =[super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        Deck *deck = [[Deck alloc]init];
        deck.generate;
    }
    return  self;
}

@end

如果我在Deck *deck = [[Deck alloc]init];按钮方法中删除drawCard,我会收到一堆错误,而且应用程序不会构建。我已尝试@synthesize deck对象,但这似乎也无效,我也尝试制作指向deck的指针,但这有点像没用,也没用。

我想实现一个标签,显示牌组中剩余的牌数,但这是不可能的,因为每次用户点击drawCard时都会生成一个新牌组。

对不起,如果这是一个愚蠢的问题&谢谢!

3 个答案:

答案 0 :(得分:0)

您的代码中存在一些问题。首先是" deck.generate;"做?这不是有效的Objective-C语法。

另一件事是,每次调用drawCard方法时,你都会重新定位一个套牌。而不是使用:

Deck *deck = [[Deck alloc]init];

您可以在界面中将Deck声明为实例变量,并使用以下内容更改上面的行:

deck = [Deck new];

答案 1 :(得分:0)

@interface ViewControllerTheOPDidntProvideANameFor ()
@property (nonatomic, strong) Deck *deck;
@end

@implementation ViewControllerTheOPDidntProvideANameFor

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self =[super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    self.deck = [[Deck alloc]init];
    [self.deck generate];
    return  self;
}

@end

答案 2 :(得分:0)

.h文件中,声明如下内容:

@property (nonatomic, strong) Deck *deck;

然后,在您的.m文件中,使用以下内容初始化套牌(最有可能在viewDidLoadviewWillAppear中):

self.deck = [[Deck alloc] init];

然后,您将能够使用deck这样的self.deck属性:

[self.deck generate]; //Good practice to use brackets instead of dot notation for function calls in Objective-C since dot operators indicate properties

希望这有帮助!

编辑:

根据DarkDust的注释,您也可以使用实例变量:

//.h    
@interface YourViewControllerName : UIViewController {

    Deck *deck;
}

//.m
- (void)viewDidLoad
{
    [super viewDidLoad];

    //Initialize the deck
    deck = [[Deck alloc] init];
}

然后可以使用deck访问您的套牌。