-1

我收到错误incompatible pointer types assigning to Deck *__strong from PlayCards *

我不确定为什么会这样。它在第一种方法中实现(甲板):

#import "CardGameViewController.h"
#import "PlayingCards.h"


@interface CardGameViewController ()
@property (weak, nonatomic) IBOutlet UILabel *cardLabel;
@property (nonatomic) NSUInteger flipsCount;
@property (strong, nonatomic) Deck *deck;
@end


@implementation CardGameViewController




-(Deck *) deck {

    if (!_deck) _deck = [[PlayingCards alloc] init];
    return _deck;
}


-(void) setFlipsCount:(NSUInteger)flipsCount {

    _flipsCount = flipsCount;
    self.cardLabel.text = [NSString stringWithFormat:@"Flips:%d", self.flipsCount];

}


- (IBAction)flipCard:(UIButton *)sender {

    sender.selected = !sender.isSelected;

    self.flipsCount++;

}


@end

这是头文件(这里什么都没有):

#import <UIKit/UIKit.h>
//#import "Card.h"
//#import "Deck.h"
//#import "PlayingCards.h"

@interface CardGameViewController : UIViewController


@end

并且从 Deck 类继承的 PlayingCard 类..

这是 PlayingCards.m

#import "PlayingCards.h"


@implementation PlayingCards

@synthesize suit = _suit;

//modifying the contents getter so it will return array with the ranks and rank+suit 
-(NSString *) contents {

    NSArray *cardsRank = [PlayingCards rankStrings];

    return [cardsRank[self.rank] stringByAppendingString:self.suit];
}

//creating a method to make sure we get validated suits
+(NSArray *) validSuit {

    return @[@"♠",@"♣",@"♥",@"♦"];
}

//creating calss method to validate the rank
+(NSArray *) rankStrings {

    return @[@"?",@"A",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"10",@"J",@"Q",@"K"];
}

//creating a new setter for suit to make sure we get the valitated suits, uding the validateSuit method
-(void) setSuit:(NSString *)suit {

    if ([[PlayingCards validSuit] containsObject:suit]) {
        _suit = suit;
    }
}

//creating new getter for suit to make sure its not empty
-(NSString *) suit {

    return _suit? _suit: @"?";
}

//creating a class method to make sure when user set the rank he will will
+(NSUInteger) maxRank {

    return [self rankStrings].count - 1;

}

//creating a new setter to the renk to make sure the rank is validates 
-(void) setRank:(NSUInteger)rank {

    if (rank <= [PlayingCards maxRank]) {

        _rank = rank;
    }
}

@end

扑克牌.h

#import "Card.h"
#import "Deck.h"

@interface PlayingCards : Card

@property (strong, nonatomic) NSString *suit;
@property (nonatomic) NSUInteger rank;

+(NSArray *) validSuit;

+(NSUInteger) maxRank;


@end
4

2 回答 2

4

这一行:

if (!_deck) _deck = [[PlayingCards alloc] init];

应该:

if (!_deck) _deck = [[PlayingCardDeck alloc] init];
于 2013-03-09T23:07:48.690 回答
0

如果 Card 的父级NSObject是您所说的类,并且PlayingCards继承自 Card,那么您不能将实例分配给PlayingCardstype 的变量Deck*。这就是编译器告诉你的。

如果你真的需要这样做,你必须写:

 if (!_deck) _deck = (Deck*)[[PlayingCards alloc] init];

It would only be valid because in Objective-C the implementation is given at runtime and which method of which class is called is only decided at runtime when the message is dispatched. However, this pattern is very unusual and you better be certain that PlayingCards is implementing all the selectors that might be called on a Deck instance. A better way would be to use protocols.

You can define a protocol and then use:

id <myProtocol> deck = [[PlayingCards alloc] init];

Put in the protocol all the selectors you need.

Why can't you use this ?

PlayingCards* deck = [[PlayingCards alloc] init];
于 2013-03-09T23:15:12.697 回答