2016-03-24 10 views
0

Ich versuche eine Spielklasse in Ziel c zu machen, habe aber einige Probleme. Ich habe große Schwierigkeiten, die Enums in Strings zu konvertieren.Erstellen einer Spielkarte in Ziel C mit Enums?

Hier ist mein Code:

#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 

Dann versuche ich ein Deck zu füllen und rufen getContents auf jeder Karte, aber alle von ihnen sind null.

Meine Aufzählungen sind einfach:

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

Und ein ähnliches für Rang. Jede Hilfe wird sehr geschätzt.

edit: Ich habe derzeit Warnungen sagen, dass ich in _RankToString oder ConvertSuitToString in GetContents in _Rank oder _Suit nicht übergeben kann.

+3

'_suit = &suit;' ist nicht das, was Sie wollen. Haben Sie Ihre Eigenschaften als "Suit *" in Ihrer .h deklariert? Es sollte nur als "Suit" deklariert werden, wie Sie es in Ihren Methoden haben, und mit "_suit = suit" eingestellt werden. Das gleiche gilt für deinen 'Rang' – dan

+0

Ja, ich habe Suit * erklärt. Lassen Sie mich sehen, ob das es behebt – Jared

+0

@dan: genial funktioniert es. ich danke dir sehr. Wenn es dir nichts ausmacht, kannst du erklären, warum ich Anzug und nicht Anzug * wollte? Ich dachte, alles in Obj C war pointerbasiert. – Jared

Antwort

0

So könnte eine mögliche

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 

Vorteile Obwohl

NS_ENUMexplained on NSHipster (vor allem, besser Compiler-Hilfe) mit tun, das alles würde Spaß machen, auch in Swift zu schreiben ... (siehe this StackOverflow question zum Beispiel ...)

bearbeiten

Ein weiterer Vorteil der Verwendung von'NS_ENUM', es generiert echte Swift enums auf der schnellen Seite (source)