2016-03-24 20 views
0

我想在目標c中製作一張紙牌類,但遇到了一些麻煩。我在將枚舉轉換爲字符串時遇到了很多麻煩。使用枚舉在目標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,但所有這些都爲空。

我的枚舉是簡單的:

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

,用一個類似的排名。任何幫助深表感謝。

編輯:我目前有警告說我不能通過_rank或_suit在getContents中轉換RankToString或convertSuitToString。

+3

'_suit = &suit;'不是你想要的。你是否在你的.h中聲明你的屬性是'Suit *'?它應該像你在你的方法中一樣被聲明爲'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'的其他優點,它在快速生成真正的Swift枚舉 (source