调试日志如下:
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)] ;
您得到的是数字的ASCII码。这就是字符的含义。
你的第二段代码更好,但使用NSMakeRange
或(NSRange){0,1}
将NSLog(@"suit: %d",suit);
更改为NSLog(@"suit: %d",suit - '0');
。
当你在NSString对象上调用characterAtIndex时,它返回一个unichar (unsigned short)变量;然后你把那个值存储在NSInteger中。你会认为这会给你一个错误。它没有这样做的原因是因为unichar(在C中是char)变量实际上是整数(在这种情况下,unichar只是被类型定义为unsigned short)。每个字符('a', 'b', 'c', 'd'等)都有一个不同的数字与之关联。在ASCII字符集中,与字符'2'相关联的数字恰好是50,与'3'相关联的数字是51。由于(无论如何在ASCII中)数字'0'到'9'的字符都是连续的,您可以通过从字符(suit - '0'
)的值中减去'0'的值来"破解"您的方法以获得实际表示的数字。由于'0'的值(在ASCII中)是48,因此减去它将得到2,2和3,而不是50,50和51。
如果你用数字表示card suits,你可以考虑将它们存储在数组中,作为数字而不是字符串。