使用枚举在 objective C 中制作扑克牌?

Making a playing card in objective C using enums?

我正在尝试在 objective c 中制作一张扑克牌 class 但遇到了一些麻烦。我在将枚举转换为字符串时遇到了很多麻烦。

这是我的代码:

#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 中的 convertRankToString 或 convertSuitToString。

这是一种方法

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

使用NS_ENUM的优点explained on NSHipster(主要是更好的编译器帮助)

尽管如此,用 Swift 编写也很有趣...(例如,参见 this Whosebug question...)

编辑

使用“NS_ENUM”的其他优势,它在 swift 端生成真正的 Swift 枚举 (source)