0

调试日志如下所示。

2013-06-09 17:09:09.192 BridgeDeal[2430:11303] suito: 2K
2013-06-09 17:09:09.193 BridgeDeal[2430:11303] suit: 50
2013-06-09 17:09:09.193 BridgeDeal[2430:11303] suito: 2Q
2013-06-09 17:09:09.193 BridgeDeal[2430:11303] suit: 50
2013-06-09 17:09:09.194 BridgeDeal[2430:11303] suito: 3J
2013-06-09 17:09:09.194 BridgeDeal[2430:11303] suit: 51

上面的值suito是正确的,但不是suit上面的值。相反,suit我希望得到 2,2,3 的值。

for (int i = 0; i<3; i++) {
    NSInteger suit = [[self.cardList objectAtIndex:i ] characterAtIndex:0] ;
    NSLog(@"suito: %@", [self.cardList objectAtIndex:i ]);
    NSLog(@"suit: %d", suit);

}

cardlist声明如下。

@property (nonatomic, weak) NSMutableArray *cardList;

我尝试了以下代码,但收到错误:bUnexpected type name 'NSRange'

NSInteger suit = [[self.cardList objectAtIndex:i ] substringWithRange:NSRange(0,1)]  ;
4

2 回答 2

2

你得到的是数字的 ASCII 码。这就是性格。

您的第二段代码更好,但使用NSMakeRange(NSRange){0,1}

于 2013-06-09T22:34:24.250 回答
1

更改NSLog(@"suit: %d",suit);NSLog(@"suit: %d",suit - '0');

当您在 NSString 对象上调用 characterAtIndex 时,它会返回一个 unichar(无符号短)变量;然后将该值存储在 NSInteger 中。你会认为这会给你一个错误。它不这样做的原因是因为 unichar(在 C 中是 char)变量实际上是整数(在这种情况下,unichar 只是 typedef'd 一个无符号短)。每个字符(“a”、“b”、“c”、“d”等)都有一个与之相关的不同数字。碰巧与 ASCII 字符集中的字符“2”关联的数字是 50,与“3”关联的数字是 51。因为(无论如何在 ASCII 中)数字“0”到“9”的字符都是连续的,你可以“破解”你的方式来获得通过减去“0”的值来表示的实际数字suit - '0')。由于“0”的值(ASCII 格式)是 48,减去它会得到 2、2 和 3,而不是 50、50 和 51。

如果您将卡片套装表示为数字,您可能会考虑将它们作为数字而不是字符串存储在数组本身中。

于 2013-06-09T22:42:25.183 回答