macOS/iOS API解説

iOS , Mac アプリケーション開発のために使われる主要フレームワークの日本語情報です。2010年代に書かれた内容です。今後更新はありません。

目次

NSScannerクラス

INDEX>Foundation>

apple(OS X)
apple(iOS)

解説

継承 NSObject
準拠 NSObject (NSObject)
フレームワーク /System/Library/Frameworks/Foundation.framework
使用可能 OS X 10.0以降
iOS 2.0以降
定義 NSDecimalNumber.h
定義 NSScanner.h

概要

適合するプロトコル

本クラスについて

NSStringオブジェクトから順番にスキャンして値を探して行きます。指定の文字の他、文字セット(NSCharacterSet)も使うことができます。

一般的な用途はカンマ区切り文字列をそれぞれの要素に分割して値を数値として取得する、@"http://www.oomori.com/test.php?name=oomori&id=1234"のようなクエリーを含むURL文字列の分解などに使います。文字列の探索はNSStringのBlock構文を使ったメソッドでもできたりNSRegularExpressionクラスを使って正規表現式で値を取り出したりもできます。

カンマ区切り文字列から項目を取り出す。

#pragma mark NSScanner scannerWithString:
-(void)method001
{
    NSCharacterSet* chSet = [NSCharacterSet characterSetWithCharactersInString:@","];
    NSString* aString= @"56.0,67.1,76.8,54,89.0";
    NSScanner* aScanner = [NSScanner scannerWithString:aString];
    NSMutableArray *mArray = [NSMutableArray arrayWithCapacity:6];
    NSString *retStr ;
    while(![aScanner isAtEnd]) {
        if([aScanner scanUpToCharactersFromSet:chSet intoString:&retStr]) {
            [mArray addObject:[NSNumber numberWithFloat:[retStr floatValue]]];
        }
        [aScanner scanCharactersFromSet:chSet intoString:NULL];
    }
    NSLog(@"%s %@",__FUNCTION__,[mArray description]);
}

クエリーを取り出す

#pragma mark NSScanner scannerWithString:
-(void)method002
{
    NSString *aString= @"http://www.oomori.com/test.php?name=oomori&id=1234";
    NSString *retStr;
    NSScanner *aScanner = [NSScanner scannerWithString:aString];
    while(![aScanner isAtEnd]) {
        [aScanner scanUpToString:@"?" intoString:&retStr];
        
        NSString *str = @"name=";
        if([aScanner scanUpToString:str intoString:&retStr]) {
            [aScanner setScanLocation: [aScanner scanLocation]+[str length] ];
            [aScanner scanUpToString:@"&" intoString:&retStr ];
            NSLog(@"%s %@",__FUNCTION__,retStr);
        }
    }
}
//=>-[OOOAppDelegate method002] oomori


ちょっと変わった使い方としては16進数の文字列を数値に変えることもできます。

#pragma mark NSScanner :
-(void)method003
{
    NSString* HEXString = @"0x1A57FE3C";
    NSScanner* aScanner = [NSScanner scannerWithString: HEXString];   
    unsigned int uiValue;
    [aScanner scanHexInt: &uiValue];
    NSLog(@"%s %u",__FUNCTION__,uiValue);   
}

スキャナの作成

文字列からスキャナを作成するメソッドは2つあります。(+ scannerWithString)メソッドと(+ localizedScannerWithString: )メソッドです。+ localizedScannerWithString:は– initWithString: でスキャナを初期化して– setLocale: で現在のロケールをセットします。
スキャナ文字列を初期化するには(– initWithString: )メソッドを使用します。

スキャナ文字列の取得

スキャナが保持している文字列を返すには(– string)メソッドを使用します。順にスキャンしていってもスキャン位置が変更されるだけでスキャナ文字列は変わりません。

スキャナの設定

現在のスキャン位置を取得するには(– scanLocation)メソッドを、スキャン位置を設定するには(– setScanLocation)メソッドを使用します。最初の位置は0から始まります。

スキャンする際に大文字小文字を無視するかをセットするには(– setCaseSensitive)メソッドを使用します。現在の設定を取得するには(– caseSensitive)メソッドを使用します。
YESが大文字小文字を区別する、NOが区別しないとなります。デフォルトはNOで、大文字小文字を区別しません。

スキャンの際にスキップする文字セットを設定するには(– setCharactersToBeSkipped)メソッドを使用します。現在設定されているスキップする文字セットを取得するには(– charactersToBeSkipped)メソッドを使用します。

現在のロケールを設定するには(– setLocale)メソッドを使用します。例えばフランス語などは桁区切りに「.」を使用し、小数点に「,」するなどの違いがありますのでfloat値の検索の際に影響があります。現在のロケールを得るには(– locale)メソッドを使用します。

文字のスキャン

指定の文字セットをスキャンする場合は(– scanCharactersFromSet:intoString)メソッドを使用します。文字セットは種類別に分けられた文字の集合体です。たとえば句読点の文字セットであれば[NSCharacterSet punctuationCharacterSet]で取得することができ、「!"#%&'()*,-./:;?@[\]_{}」が返されます。これをひとかたまりとして扱うことができます。
指定の文字セットまでをスキャンする場合は(– scanUpToCharactersFromSet:intoString)メソッドを使用します。指定の文字セットまでを蓄積しintoString:で渡された文字列オブジェクトに蓄積した文字列を返します。

指定の文字をスキャンする場合には(– scanString:intoString)メソッドを使用します。特定しない文字列をスキャンするには(– scanUpToString:intoString)メソッドを使用します。次のスキャン項目までの文字を蓄積した後 intoString:で与えた文字列オブジェクトに返します。

数値をスキャンするには数値の型に応じたメソッドを使用します。Decimal(– scanDecimal: )、Double(– scanDouble: )、Float(– scanFloat: )、Int(– scanInt: )、NSInteger(– scanInteger: )、long long(– scanLongLong)、0xで表された文字をIntに(– scanHexInt)、0xで表された文字をFloatに(– scanHexFloat)、0xで表された文字をDoubleに(– scanHexDouble)、0xで表された文字をlong longに(– scanHexLongLong)と10種類あります。

現在最後の文字までスキャンしたかどうかを調べるには(– isAtEnd)メソッドを使用します。通常この値をチェックしながらループを回していくことになります。


サブクラス化の注意