NSScanner 如果没有找到有效的字符串,将返回NO,根据其验证规则:
十六进制整数表示可以选择以 0x 或 0X 开头。
下面是演示这个的示例代码:
NSString *valid1 = @"ae";
NSString *valid2 = @"0xae";
NSString *valid3 = @"0Xae";
NSString *invalid1 = @"ze";
NSString *invalid2 = @"hello";
void (^scanBlock)(NSString *) = ^(NSString *toScan) {
NSScanner *scanner = [NSScanner scannerWithString:toScan];
UInt32 parsed = 0;
BOOL success = [scanner scanHexInt:&parsed];
NSLog(
@"Scanner %@ able to scan the string %@. parsed's value is %x",
success ? @"was" : @"wasn't",
toScan,
parsed);
};
for (NSString *valid in @[ valid1, valid2, valid3]) {
scanBlock(valid);
}
for (NSString *invalid in @[invalid1, invalid2]) {
scanBlock(invalid);
}
以上代码的输出为:
Scanner was able to scan the string ae. parsed's value is ae
Scanner was able to scan the string 0xae. parsed's value is ae
Scanner was able to scan the string 0Xae. parsed's value is ae
Scanner wasn't able to scan the string ze. parsed's value is 0
Scanner wasn't able to scan the string hello. parsed's value is 0
但是,由于其灵活性,NSScanner 不会应用超出其立即扫描位置的验证规则。它还将某些字符串视为无效,而其他人可能认为是有效的十六进制字符串。例如:
NSString *greyArea1 = @"x23";
NSString *greyArea2 = @"artichoke";
NSString *greyArea3 = @"1z";
NSString *greyArea4 = @" a3";
for (NSString *grey in @[greyArea1, greyArea2, greyArea3, greyArea4]) {
scanBlock(grey);
}
即使这些字符串对于期望输入严格为表示十六进制数字的字符串的应用程序来说是无效的,并且有些人可能认为“x23”是一个有效的十六进制字符串,但此代码会给出以下输出:
Scanner wasn't able to scan the string x23. parsed's value is 0
Scanner was able to scan the string artichoke. parsed's value is a
Scanner was able to scan the string 1z. parsed's value is 1
Scanner was able to scan the string a3. parsed's value is a3
由于 Java 的 Integer 类和 NSScanner 具有如此不同的用途,因此它们用于验证字符串的规则大不相同,我认为这是您问题的根源。如果您确实希望使用NSScanner,那么您必须应用对您的应用程序有意义的验证规则,这会干扰NSScanner 的一般操作。