2016-03-24 16 views
0

私は対戦カードのクラスを対戦カードにしようとしていますが、何らかの問題があります。列挙型に変換するのに苦労しています。enumを使用して客観的なCでトランプを作る?

#import "Card.h" 

@interface Card() 
-(NSString *) convertRankToString:(Rank)rank; 
-(NSString *)convertSuitToString:(Suit) suit; 
@end 

@implementation Card 

-(id) initWithSuitAndRank:(Rank)rank suit:(Suit)suit { 
    self = [super init]; 

    if (self) { 

     _suit = &suit; 
     _rank = &rank; 

    } 

    return self; 
} 

-(NSString *) getRank { 
    return [self convertRankToString: _rank]; 
} 

-(NSString *) getSuit { 
    return [self convertSuitToString: _suit]; 
} 

-(NSString *) getContents { 
    return [[self getRank] stringByAppendingString:[self getSuit]]; 
} 

-(NSString *) convertRankToString:(Rank)rank { 
switch (rank) { 
    case NONE: 
     return @"None"; 
     break; 
    case ACE: 
     return @"A"; 
     break; 
    case TWO: 
     return @"2"; 
     break; 
    case THREE: 
     return @"3"; 
     break; 
    case FOUR: 
     return @"4"; 
     break; 
    case FIVE: 
     return @"5"; 
     break; 
    case SIX: 
     return @"6"; 
     break; 
    case SEVEN: 
     return @"7"; 
     break; 
    case EIGHT: 
     return @"8"; 
     break; 
    case NINE: 
     return @"9"; 
     break; 
    case TEN: 
     return @"10"; 
     break; 
    case JACK: 
     return @"J"; 
     break; 
    case QUEEN: 
     return @"Q"; 
     break; 
    case KING: 
     return @"K"; 
     break; 
    default: 
     return @""; 
} 
} 

-(NSString *)convertSuitToString:(Suit) suit { 
    switch (suit) { 
     case Clubs: 
      return @"♣︎"; 
      break; 
     case Diamonds: 
      return @"♦︎"; 
      break; 
     case Hearts: 
      return @"♥︎"; 
      break; 
     case Spades: 
      return @"♠︎"; 
      break; 
     default: 
      return @""; 
      break; 
    } 
} 

@end 

は、その後、私はデッキを記入し、各カード上のgetContentsをコールしようとするが、それらのすべてがnullです:

は、ここに私のコードです。

私の列挙型は単純です:

typedef enum Suit 
{ 
    Clubs, 
    Hearts, 
    Diamonds, 
    Spades 
} Suit; 

とランクのための同様のもの。どんな助けも大歓迎です。

編集:現在、getContentsでconvertRankToStringまたはconvertSuitToStringに_rankまたは_suitを渡すことができないという警告が表示されます。

+3

'_suit = &suit;'はあなたが望むものではありません。あなたはあなたのプロパティを 'Suit *'としてあなたの.hで宣言しましたか?あなたのメソッドにあるように 'Suit'と宣言され、' _suit = suit'で設定されるべきです。あなたのランクと同じこと – dan

+0

私はスーツを宣言しました*。それが修正されるかどうか確認してみましょう – Jared

+0

@dan:素晴らしいです。どうもありがとうございます。あなたがなぜ私はスーツではなくスーツ*を望んでいたのか説明できますか?私はObj Cのすべてがポインタベースであると思った。 – Jared

答えて

0

ここでそれをNS_ENUMexplained on NSHipsterを使用しての

typedef NS_ENUM(NSInteger, Suit) { 
    Clubs, 
    Hearts, 
    Diamonds, 
    Spades 
}; 

typedef NS_ENUM(NSInteger, Rank) { 
    King, 
    Queen, 
    Jack, 
    // ... 
    Three, 
    Two, 
    One 
}; 

@interface Card : NSObject 

    @property (nonatomic, assign) Suit suit; 
    @property (nonatomic, assign) Rank rank; 

@end 


@implementation Card 

- (NSString *)stringForSuit 
{ 
    static NSDictionary *SuitToString = nil; 

    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     SuitToString = @{ 
         @(Clubs): @"♣︎", 
         @(Hearts): @"♥︎", 
         @(Diamonds): @"♦︎", 
         @(Spades): @"♠︎", 
         }; 
    }); 
    return SuitToString[@(self.suit)]; 
} 

- (NSString *)stringForRank 
{ 
    static NSDictionary *RanksToString = nil; 

    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     RanksToString = @{ 
          @(King): @"King", 
          @(Queen): @"Queen", 
          @(Jack): @"Jack", 
          // ... 
          @(Three): @"3", 
          @(Two): @"2", 
          @(One): @"Ace", 
          }; 
    }); 
    return RanksToString[@(self.rank)]; 
} 

- (NSString *)description 
{ 
    return [NSString stringWithFormat:@"%@ %@",[self stringForRank],[self stringForSuit]]; 
} 

@end 

利点(主に、より良いコンパイラのヘルプ)を行うための一つの方法

が、これはすべての参照(...あまりにスウィフトに書くのは楽しいだろう例えばthis StackOverflow question ...)

編集

'NS_ENUM 'を使うことの他の利点は、素早い側で素早い列挙型を生成することです。 (source