午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

NSScanner類的基本用法

 宇智波瞬潤 2016-09-06

NSScanner是一個類,用于在字符串中掃描指定的字符,尤其是把它們翻譯/轉(zhuǎn)換為數(shù)字和別的字符串。可以在創(chuàng)建NSScaner時指定它的string屬性,然后scanner會按照你的要求從頭到尾地掃描這個字符串的每個字符。 

創(chuàng)建一個Scanner 

NSScanner是一個類族, NSScanner是其中公開的一類。通常,可以用scannerWithString:或localizedScannerWithString:方法初始化一個scanner。這兩個方法都返回一個scanner對象并用你傳遞的字符串參數(shù)初始化其string屬性。剛創(chuàng)建時scanner對象指向字符串的開頭。scanner方法開始掃描,比如scanInt:,scanDouble:,scanString:intoString:。如果你要想掃描多遍,通常需要使用while循環(huán),

例如如下代碼所示

  1. float aFloat;  
  2.    
  3. NSScanner *theScanner = [NSScanner scannerWithString:aString];  
  4.    
  5. while ([theScanner isAtEnd] == NO) {  
  6.     
  7.     [theScanner scanFloat:&aFloat];  
  8.    
  9.     // implementation continues...  
  10.    
  11. }   

以上例子會循環(huán)的搜索字符串中的浮點(diǎn)值,并賦值給aFloat參數(shù)。這個時候isAtEnd便會緊接上一次搜索到的字符位置繼續(xù)搜索看是否存在下一個浮點(diǎn)值,直至掃描結(jié)束。掃描動作的核心就是位置的變動。位置不停地在掃描中移動,直至結(jié)束掃描。

另外,還可以通過setCaseSensitive:方法設(shè)置是否忽略大小寫,默認(rèn)是忽略。

  

Scanner的使用

掃描操作從上次掃描的位置開始,并且繼續(xù)往后掃描直到指定的內(nèi)容出現(xiàn)為止(如果有的話)。

以字符串“137 small cases of bananas”為例,在掃描完一個整數(shù)之后,scanner的位置將變?yōu)?,也即數(shù)字后面的空格處。通常,你會繼續(xù)掃描并跳過你不關(guān)心的字符。那么你可以用setScanLocation:方法跳過某幾個字符(也可以用這個方法在發(fā)生某些錯誤后,重新開始掃描字符串的某部分)。如果你想跳過某種特殊的字符集中的字符時,可以使用setCharactersToBeSkipped:方法。scanner在任何掃描操作時會跳過空白字符之后才開始。但是當(dāng)它找到一個可以掃描的字符時,它會用全部字符去和指定內(nèi)容匹配。scanner默認(rèn)情況下會忽略空白字符和換行符。注意,對于忽略字符,總是大小寫敏感的。例如要忽略所有原音字母,你必須使用“AEIOUaeiou”,而不能僅僅是“AEIOU”或“aeiou”。

如果你想獲取當(dāng)前位置的某個字符串的內(nèi)容,可以使用scanUpToString:intoString:方法(如果你不想保留這些字符,可以傳遞一個NULL給第2個參數(shù))。

例如,以下列字符串為例:

137 small cases of bananas
  

下面的代碼,可以從字符串中找出包裝規(guī)格(small cases)和包裝數(shù)量(137)。 

  1. NSString *bananas = @"137 small cases of bananas";  
  2. NSString *separatorString = @" of";  
  3. NSScanner *aScanner = [NSScanner scannerWithString:bananas];    
  4. NSInteger anInteger;  
  5. [aScanner scanInteger:&anInteger];  
  6. NSString *container;  
  7. [aScanner scanUpToString:separatorString intoString:&container];   

查找字符串separatorString為“ of”關(guān)系重大。默認(rèn)scanner會忽略空白字符,因此在數(shù)字137后面的空格被忽略。但是當(dāng)scanner從空格后面的字符開始時,所有的字符都被加到了輸出字符串中,一直到遇到搜索字符串(“of”)。

如果搜索字符串是“of”(前面沒空格),container的第一個值應(yīng)該是“smallcases ”(后面有個空格);如果搜索字符串是“ of”(前面有空格),則container的第1個值是“small cases”(后面無空格)。

在掃描到指定字符串(搜索字符串)之后,scanner的位置指向了該字符串開始處。如果你想繼續(xù)掃描該字符串之后的字符,必須先掃描指定字符串(搜索字符串)。下列代碼演示了如何跳過搜索字串并取得產(chǎn)品類型。注意我們使用了substringFromIndex:,等同于繼續(xù)掃描直到整個字符串的末尾。

 

  1. [aScanner scanString:separatorString intoString:NULL];  
  2. NSString *product;  
  3. product = [[aScanner string] substringFromIndex:[aScanner scanLocation]];  
  4. // could also use:  
  5. // product = [bananas substringFromIndex:[aScanner scanLocation]];   

示例:

假設(shè)你有如下字符串:

Product: Acme Potato Peeler; Cost: 0.98 73
Product: Chef Pierre Pasta Fork; Cost: 0.75 19
Product: Chef Pierre Colander; Cost: 1.27 2
 

以下代碼演示了讀取產(chǎn)品名稱和價格的操作(價格簡單地讀作一個float),跳過“Product:”和“Cost:"子串,以及分號。注意,因為scanner默認(rèn)忽略空白字符和換行符,循環(huán)中沒有指定對它們的處理(尤其對于讀取末尾的整數(shù)而言,并不需要處理額外的空白字符)。

  1. NSString *string = @"Product: Acme Potato Peeler; Cost: 0.98 73\n\  
  2. Product: Chef Pierre Pasta Fork; Cost: 0.75 19\n\  
  3. Product: Chef Pierre Colander; Cost: 1.27 2\n";  
  4.    
  5. NSCharacterSet *semicolonSet;  
  6. NSScanner *theScanner;  
  7.    
  8. NSString *PRODUCT = @"Product:";  
  9. NSString *COST = @"Cost:";  
  10.    
  11. NSString *productName;  
  12. float productCost;  
  13. NSInteger productSold;  
  14.    
  15. semicolonSet = [NSCharacterSet characterSetWithCharactersInString:@";"];  
  16. theScanner = [NSScanner scannerWithString:string];  
  17.    
  18. while ([theScanner isAtEnd] == NO)  
  19.    
  20. {  
  21.    
  22.     if ([theScanner scanString:PRODUCT intoString:NULL] &&  
  23.    
  24.         [theScanner scanUpToCharactersFromSet:semicolonSet  
  25.    
  26.             intoString:&productName] &&  
  27.    
  28.         [theScanner scanString:@";" intoString:NULL] &&  
  29.    
  30.         [theScanner scanString:COST intoString:NULL] &&  
  31.    
  32.         [theScanner scanFloat:&productCost] &&  
  33.    
  34.         [theScanner scanInteger:&productSold])  
  35.    
  36.     {  
  37.    
  38.         NSLog(@"Sales of %@: $%1.2f", productName, productCost * productSold);  
  39.    
  40.     }  
  41.    
  42. }  


本地化

Scanner支持本地化的掃描,可以指定語言和方言。NSScanner只在小數(shù)點(diǎn)分隔符上使用locale屬性(以NSDecimalSeparator為key)。你可以用lcoalizedScannerWithString:創(chuàng)建指定locale的scanner,或者用setLocale:方法顯示地指定scanner的locale屬性。如果你不指定locale,scanner假定使用默認(rèn)的locale。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多