-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

PlayingCards.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

NSObjectあなたが言うようにCardの親がクラスであり、それがCardから継承している場合、のインスタンスをタイプの変数にPlayingCards割り当てることはできません。それがコンパイラーがあなたに言っていることです。PlayingCardsDeck*

あなたが本当にそれをする必要があるならば、あなたは書く必要があります:

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

Objective-Cでは実装が実行時に与えられ、どのクラスが呼び出されるかは実行時にメッセージがディスパッチされるときにのみ決定されるため、これは有効です。ただし、このパターンは非常に珍しいため、PlayingCardsがDeckインスタンスで呼び出される可能性のあるすべてのセレクターを実装していることを確認してください。より良い方法は、プロトコルを使用することです。

プロトコルを定義してから、以下を使用できます。

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

必要なすべてのセレクターをプロトコルに入れます。

なんで使えないの?

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