使用枚举在 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)
我正在尝试在 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)