NSScanner是一个类,用于在字符串中扫描指定的字符,尤其是把它们翻译/转换为数字和别的字符串。可以在创建NSScaner时指定它的string属性,然后scanner会按照你的要求从头到尾地扫描这个字符串的每个字符。
刚创建时scanner对象指向字符串的开头。scanner方法开始扫描,比如scanInt:,scanDouble:,scanString:intoString:。如果你要想扫描多遍,通常需要使用while循环,
float aFloat;
NSScanner *theScanner = [NSScanner scannerWithString:aString];//创建一个scanner对象;
while ([theScanner isAtEnd] ==NO) {//判断是否扫描到结尾,如果没有扫描到结尾,循环扫描
[theScanner scanFloat:&aFloat];//搜索字符串中的浮点值,并赋值给aFloat参数。扫描到某个类型就结束,(如果还要扫描其他的浮点数,接着上次继续执行一次代码);
循环扫描-----这个时候isAtEnd便会紧接上一次搜索到的字符位置继续搜索看是否存在下一个浮点值,直至扫描结束。扫描动作的核心就是位置的变动。位置不停地在扫描中移动,直至结束扫描。
}
=================
NSString *bananas = @"137 0.5 small cases of bananas 嗷嗷 版本 存";
NSString *separatorString = @"of";
NSScanner *aScanner = [NSScanner scannerWithString:bananas];
NSInteger anInteger;
[aScanner scanInteger:&anInteger];//扫描integer类型的字符,存到anInteger中
NSString *container;
[aScanner scanUpToString:separatorString intoString:&container];//接着上面的integer类型扫描(如果前面没有integer扫描,则从头扫描),默认忽略integer后面的空格,如果separatorString中的字符串of前面没有空格(或有一个空格)/of后面没有空格(或有一个空格)则扫描integer到separatorString之间的所有字符;如果separatorString中的字符串of前面有两个或以上空格/of后面有两个或以上空格,则扫描到integer后面的所有字符;
====================
NSString *string = @"Product: Acme Potato Peeler; Cost: 0.98 73\n\
Product: Chef Pierre Pasta Fork; Cost: 0.75 19\n\
Product: Chef Pierre Colander; Cost: 1.27 2\n";
NSCharacterSet *semicolonSet;
NSScanner *theScanner;
NSString *PRODUCT = @"Product:";
NSString *COST = @"Cost:";
NSString *productName;
float productCost;
NSInteger productSold;
semicolonSet = [NSCharacterSet characterSetWithCharactersInString:@";"];//字符集的取值范围是分号(也就是字符串中的每个字符)
NSLog(@"----%@",semicolonSet);
theScanner = [NSScanner scannerWithString:string];
while ([theScanner isAtEnd] == NO)//判断是否到了自符串结尾
{
//扫描到了PROUDUCT:,分号,COST:过滤掉(不保存)
if ([theScanner scanString:PRODUCT intoString:NULL]//扫描PRODUCT
&&
[theScanner scanUpToCharactersFromSet:semicolonSet
intoString:&productName]//接着上面PRODUCT后,扫描semicolonSet(即分号)前面的字符
&&
[theScanner scanString:@";" intoString:NULL]//扫描分号
&&
[theScanner scanString:COST intoString:NULL]//扫描COST
&&
[theScanner scanFloat:&productCost]//扫描float类型
&&
[theScanner scanInteger:&productSold])//扫描integer类型
{
NSLog(@"Sales of--- %@: $%1.2f", productName, productCost * productSold);
}
}
//NSCanner下面的属性和方法
@property (readonly, copy) NSString *string;//scanner类型转换成字符串类型
@property NSUInteger scanLocation;//设置开始扫描的位置
@property (nullable, copy) NSCharacterSet *charactersToBeSkipped;//扫描的时候需要忽略的值
@propertyBOOL caseSensitive;//是否区分大小写
@property (nullable, retain)id locale;
- (instancetype)initWithString:(NSString *)string;
//NSCanner分类中的属性和方法:
- (BOOL)scanInt:(nullableint *)result;//扫描int类型,并且赋值给result类型
- (BOOL)scanInteger:(nullableNSInteger *)result;//扫描integer类型
- (BOOL)scanLongLong:(nullablelong long *)result;
- (BOOL)scanUnsignedLongLong:(nullableunsigned longlong *)result ;
- (BOOL)scanFloat:(nullablefloat *)result;
- (BOOL)scanDouble:(nullabledouble *)result;
- (BOOL)scanHexInt:(nullableunsigned *)result; // Optionally prefixed with "0x" or "0X"
- (BOOL)scanHexLongLong:(nullableunsigned longlong *)result; // Optionally prefixed with "0x" or "0X"
- (BOOL)scanHexFloat:(nullablefloat *)result; // Corresponding to %a or %A formatting. Requires "0x" or "0X" prefix.
- (BOOL)scanHexDouble:(nullabledouble *)result; // Corresponding to %a or %A formatting. Requires "0x" or "0X" prefix.
- (BOOL)scanString:(NSString *)string intoString:(NSString *_Nullable * _Nullable)result;//从scan中扫描出string放入result中,如果不需要存储string,则result传NULL
- (BOOL)scanCharactersFromSet:(NSCharacterSet *)set intoString:(NSString * _Nullable * _Nullable)result;//从scan中扫描出string放入result中,如果不需要存储string,则result传NULL
- (BOOL)scanUpToString:(NSString *)string intoString:(NSString *_Nullable * _Nullable)result;//从scan中扫描出string之外的数据放入result中,如果不需要存储string,则result传NULL
- (BOOL)scanUpToCharactersFromSet:(NSCharacterSet *)set intoString:(NSString * _Nullable * _Nullable)result;//从scan中扫描出set之外的数据放入result中,如果不需要存储string,则result传NULL
@property (getter=isAtEnd,readonly) BOOL atEnd;//是否扫描到了结尾;
+ (instancetype)scannerWithString:(NSString *)string;//初始化一个scanner
+ (id)localizedScannerWithString:(NSString *)string;//初始化一个scanner