【初心者向け】Objective-CのrangeOfStringを使った7つのテクニック – Japanシーモア

【初心者向け】Objective-CのrangeOfStringを使った7つのテクニック

初心者でも分かるObjective-CのrangeOfStringメソッド解説とサンプルコードObjctive-C
この記事は約19分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

このサービスは複数のSSPによる協力の下、運営されています。

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

プログラミングに足を踏み入れたばかりのあなたも、Objective-Cというプログラミング言語の一つを聞いたことがあるかもしれません。

特にiOSアプリ開発において長年使われてきたこの言語は、Appleの開発環境と深い関連性を持ちながら、強力な機能と直感的なコードの書きやすさを提供しています。

この記事では、Objective-Cの基礎から、rangeOfStringメソッドを使った文字列操作のテクニックを7つ紹介し、初心者でも簡単に文字列検索や処理ができるようになることを目指します。

●Objective-Cとは

Objective-Cは、C言語をベースにしたオブジェクト指向プログラミング言語です。

C言語のシンタックスを踏襲しつつ、Smalltalk言語のオブジェクト指向の特徴を組み合わせて拡張されました。

その結果、強力な表現力と柔軟性を兼ね備え、AppleのiOSやmacOSのアプリケーション開発に不可欠な存在となっています。

さらに、Objective-Cは動的なタイピングをサポートするため、開発者はプログラムの多くを実行時に制御できます。

これにより、開発プロセスがより柔軟になり、エラーの検出と修正が容易になると同時に、プログラムの再利用と拡張が簡単になります。

○Objective-Cの基礎知識

Objective-Cを学ぶ上で、まず押さえておくべきは、その文法と基本的なオブジェクト指向の概念です。

Objective-Cでのプログラムは「クラス」と「メソッド」で構成されており、これらのクラスがオブジェクトとして実行時に動作します。

Objective-Cの特徴の一つに、「メッセージ送信」という概念があります。

これは、オブジェクトに対して行いたい操作をメッセージとして送り、オブジェクトが適切なメソッドを呼び出して応答するというものです。

また、Objective-Cは「カテゴリ」や「プロトコル」といった強力な機能を提供し、コードのモジュール性と再利用性を高める手助けをしています。

●rangeOfStringメソッドの基本

Objective-Cでの文字列処理は、日々のプログラミング作業において避けて通れない重要な部分です。

中でもrangeOfStringメソッドは、ある文字列(NSStringオブジェクト)の中で特定の文字列を探すときに用います。

このメソッドは、指定された部分文字列が最初に現れる位置の範囲をNSRange構造体として返すことで、文字列の検索や処理を行う基盤を提供します。

rangeOfStringメソッドの基本的な形式は次のようになります。

- (NSRange)rangeOfString:(NSString *)aString;

ここで、aStringは検索したい部分文字列を指します。

返り値はNSRange構造体で、検索された文字列が見つかった場合はその範囲を、見つからなかった場合は{NSNotFound, 0}を返します。

NSNotFoundは検索した文字列が存在しないことを表す特別な値です。

○rangeOfStringの基本的な概念と使い方

rangeOfStringメソッドを使用する一番シンプルな例は、単一の文字列の中から別の文字列を探す場合です。

下記のObjective-Cコード例では、「Hello, World!」という文字列の中から「World」という単語を探し、その位置をコンソールに出力する方法を表しています。

NSString *originalString = @"Hello, World!";
NSString *searchString = @"World";
NSRange searchRange = [originalString rangeOfString:searchString];

if (searchRange.location != NSNotFound) {
    NSLog(@"'%@'が見つかった範囲: %@", searchString, NSStringFromRange(searchRange));
} else {
    NSLog(@"'%@'は見つかりませんでした。", searchString);
}

このコードを実行すると、「World」が「Hello, World!」の第7位置に見つかり、範囲が(7,5)として出力されることがわかります。

これは、「World」という文字列が7文字目から始まり、5文字の長さを持つことを表しています。

●文字列検索の基本テクニック

文字列検索は、プログラミングにおける最も一般的なタスクの一つです。

Objective-Cにおいて、文字列検索の多くはrangeOfStringメソッドを使って実行されます。

ここでは、いくつかの基本テクニックを紹介し、実際のコード例と共にその使い方を解説します。

○サンプルコード1:単語の存在チェック

文字列内に特定の単語やフレーズが存在するかどうかを確認するには、rangeOfStringメソッドを使用します。

存在チェックは、ユーザー入力の検証や、特定のキーワードに基づいた検索機能など、さまざまな場面で利用されます。

下記のコードは、一つの文字列内で別の文字列が存在するかどうかを確認し、結果をログに出力する方法を表しています。

NSString *fullText = @"Objective-CのrangeOfStringメソッドを学ぼう。";
NSString *wordToFind = @"学ぼう";
NSRange range = [fullText rangeOfString:wordToFind];

if (range.location != NSNotFound) {
    NSLog(@"見つかりました。範囲: %@", NSStringFromRange(range));
} else {
    NSLog(@"見つかりませんでした。");
}

このコードを実行すると、”学ぼう”という文字列が”Objective-CのrangeOfStringメソッドを学ぼう。”の中に含まれているため、「見つかりました。範囲: {xx, yy}」という形式で範囲がコンソールに出力されます。

ここでxxは”学ぼう”が開始するインデックス、yyはその長さを示しています。

○サンプルコード2:文字列の位置取得

プログラムがユーザーからの入力を受け取ったり、文書を解析したりする際に、特定の文字列がどこにあるかを知ることはしばしば重要です。

rangeOfStringメソッドを使用して、特定の文字列の位置や範囲を取得することができます。

下記の例では、”Objective-C”という単語が最初に現れる位置を特定しています。

NSString *exampleText = @"Objective-Cでプログラミング。Objective-Cは強力です。";
NSString *keyword = @"Objective-C";
NSRange rangeOfKeyword = [exampleText rangeOfString:keyword];

if (rangeOfKeyword.location != NSNotFound) {
    NSLog(@"'%@'は最初にこの位置に見つかりました: %@", keyword, NSStringFromRange(rangeOfKeyword));
} else {
    NSLog(@"'%@'は見つかりませんでした。", keyword);
}

このコードを実行すると、”Objective-C”が”Objective-Cでプログラミング。

Objective-Cは強力です。”の中で最初に見つかった位置の情報が出力されます。

○サンプルコード3:大文字と小文字を区別しない検索

デフォルトでは、rangeOfStringメソッドは大文字と小文字を区別して検索を行います。

しかし、場合によっては大文字と小文字を区別せずに検索を行いたいことがあります。

そんな時には、検索オプションを指定することで、この動作を変更することができます。

下記のコードは、大文字と小文字を区別せずに文字列を検索する方法を表しています。

NSString *mixedCaseText = @"Objective-C、Objective-c、objective-Cの違いを理解しよう。";
NSString *searchTerm = @"objective-c";
NSRange caseInsensitiveRange = [mixedCaseText rangeOfString:searchTerm options:NSCaseInsensitiveSearch];

if (caseInsensitiveRange.location != NSNotFound) {
    NSLog(@"大文字小文字を区別せずに'%@'が見つかりました。範囲: %@", searchTerm, NSStringFromRange(caseInsensitiveRange));
} else {
    NSLog(@"'%@'は見つかりませんでした。", searchTerm);
}

このコードでは、NSCaseInsensitiveSearchオプションを使用して、大文字と小文字を区別せずに”objective-c”を検索しています。

結果として、”Objective-C”、”Objective-c”、”objective-C”のすべてのバリエーションが見つかり、その範囲がログに出力されます。

●文字列検索の応用テクニック

Objective-CのrangeOfStringメソッドの応用テクニックを学ぶことで、より複雑な文字列処理が可能になります。

ここでは、複数の文字列を検索したり、文字列の置換や正規表現を使った検索方法について詳しく見ていきます。

○サンプルコード4:複数の文字列の検索

複数の異なる文字列を順番に検索する場合、rangeOfStringメソッドをループ内で使用することが効果的です。

ここでは、複数の検索語を含むNSArrayをループして、それぞれの文字列が親文字列内に存在するかをチェックするコード例を紹介します。

NSString *baseString = @"この文章はObjective-CのrangeOfStringサンプルです。";
NSArray *searchTerms = @[@"Objective-C", @"rangeOfString", @"サンプル", @"Swift"];

for (NSString *term in searchTerms) {
    NSRange range = [baseString rangeOfString:term];
    if (range.location != NSNotFound) {
        NSLog(@"'%@'が見つかりました。位置: %@", term, NSStringFromRange(range));
    } else {
        NSLog(@"'%@'が見つかりませんでした。", term);
    }
}

このコードを実行すると、指定されたすべての検索語について、その存在と位置がコンソールに出力されます。

この方法は、特定の単語の集合に対するドキュメントの検索やキーワードのハイライト表示に役立ちます。

○サンプルコード5:文字列の置換

文字列内の特定の部分を別の文字列で置換するには、rangeOfStringメソッドで検索範囲を見つけ、その範囲を指定してNSStringのstringByReplacingCharactersInRangeメソッドを使用します。

NSString *originalString = @"Objective-Cは面白いです。Objective-Cは強力です。";
NSString *stringToReplace = @"Objective-C";
NSString *replacementString = @"Swift";

NSRange range = [originalString rangeOfString:stringToReplace];
while (range.location != NSNotFound) {
    originalString = [originalString stringByReplacingCharactersInRange:range withString:replacementString];
    range = [originalString rangeOfString:stringToReplace];
}

NSLog(@"置換後の文字列: %@", originalString);

実行結果として、「Objective-C」が「Swift」に置換された新しい文字列が出力されます。

この技術は、テキスト編集アプリケーションやコンテンツ管理システムで一般的に使用されます。

○サンプルコード6:正規表現を使った検索

Objective-Cでは、NSRegularExpressionクラスを使用して正規表現による検索を行うことができます。

これは、複雑なパターンマッチングや、文字列の検証に非常に有効です。

ここでは、正規表現を使用して電話番号のパターンを検索する例を紹介します。

NSString *textContainingNumbers = @"私の電話番号は123-456-7890です。別の番号は987-654-3210です。";
NSError *error = nil;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\d{3}-\\d{3}-\\d{4}"
                                                                       options:NSRegularExpressionCaseInsensitive
                                                                         error:&error];
NSArray *matches = [regex matchesInString:textContainingNumbers options:0 range:NSMakeRange(0, [textContainingNumbers length])];

for (NSTextCheckingResult *match in matches) {
    NSRange matchRange = [match range];
    NSString *matchedString = [textContainingNumbers substringWithRange:matchRange];
    NSLog(@"マッチした文字列: %@", matchedString);
}

このコードでは、標準の電話番号フォーマットに一致する文字列を探し、それぞれをログに出力しています。

このような正規表現の使用は、フォームのバリデーションやデータ処理において非常に役立ちます。

●rangeOfStringの注意点と対処法

Objective-Cでの文字列処理は多くの場面で必要とされ、rangeOfStringメソッドはその中心的な役割を担っています。

文字列の検索、特にサブストリングがメインストリング内に存在するかどうかを確認する際には、このメソッドが非常に有用です。

しかし、その使用には注意を要するいくつかの点があります。

最も一般的な問題の一つは、検索対象の文字列が見つからない場合にNSNotFoundを返すことです。

NSNotFoundNSUIntegerの最大値であり、この値を受け取った場合、プログラムは対象の文字列が見つからなかったと解釈すべきです。

これを適切にハンドリングしないと、プログラムは予期せぬ振る舞いを示す可能性があります。

さらに、rangeOfStringはデフォルトで大文字と小文字を区別するため、意図しない結果を引き起こすことがあります。

たとえば、ユーザーが検索機能を使用している場合、”Apple”と”apple”は別の単語として認識されるため、ユーザーが期待する結果が得られないかもしれません。

これらの問題に対処するためには、適切なエラーハンドリングと検索オプションの使用が推奨されます。

これらの注意点に対応するサンプルコードを紹介し、それについて詳しく解説します。

○サンプルコード7:エラーハンドリングの実装

Objective-CのrangeOfStringメソッドを用いて、検索文字列が見つからない場合にエラーハンドリングを行う方法を紹介します。

下記のコード例は、検索対象の文字列にサブストリングが含まれているかどうかを確認し、含まれていない場合にはユーザーにその情報を通知する方法を表しています。

// 検索対象となるメインの文字列
NSString *mainString = @"Objective-CのrangeOfStringを理解する。";
// 検索したいサブストリング
NSString *substringToSearch = @"Swift";

// rangeOfStringメソッドを使用して検索を実行
NSRange range = [mainString rangeOfString:substringToSearch];

// 検索結果の評価
if (range.location == NSNotFound) {
    // サブストリングが見つからない場合の処理
    NSLog(@"'%@'はメイン文字列に含まれていません。", substringToSearch);
} else {
    // サブストリングが見つかった場合の処理
    NSLog(@"'%@'が見つかった位置: %@", substringToSearch, NSStringFromRange(range));
}

このコードでは、まずメインの文字列と検索したいサブストリングを定義しています。

次に、rangeOfStringメソッドを使用してメインの文字列内でサブストリングを検索しています。

NSRange構造体のlocationプロパティがNSNotFoundと等しいかどうかをチェックしており、これによりサブストリングがメイン文字列に含まれているかどうかを判断しています。

このサンプルコードを実行すると、メインの文字列にサブストリングが含まれていない場合は、コンソールにその旨が出力されます。

サブストリングが見つかった場合には、その位置が出力されます。

●rangeOfStringメソッドのカスタマイズ方法

Objective-CのrangeOfStringメソッドは、その柔軟性とカスタマイズ性の高さから、多様な文字列処理のシナリオで活用されています。

rangeOfStringメソッドの基本機能は、ある文字列(サブストリング)が他の文字列(メインストリング)内に存在するかどうかを判定し、存在する場合はその範囲をNSRangeオブジェクトとして返します。

しかし、この基本的な機能を超えて、さまざまなカスタマイズが可能です。

ここでは、そのカスタマイズ方法についていくつかの技術を紹介します。

○文字列検索オプションの指定

rangeOfStringメソッドでは、検索処理をカスタマイズするためにいくつかのオプションを指定することができます。

たとえば、大文字と小文字を区別せずに検索を行いたい場合や、特定の文化的環境(ロケール)に基づいた検索を実施したい場合には、次のようにオプションを指定できます。

NSString *mainString = @"Objective-CのrangeOfStringのカスタマイズ方法を学ぼう。";
NSString *searchString = @"objective-c";
NSRange range = [mainString rangeOfString:searchString options:NSCaseInsensitiveSearch];

if (range.location != NSNotFound) {
    NSLog(@"見つかりました: %@", NSStringFromRange(range));
} else {
    NSLog(@"該当する文字列は見つかりませんでした。");
}

このコードスニペットでは、NSCaseInsensitiveSearchオプションを指定して大文字と小文字を区別せずに検索を行っています。

検索結果が見つかった場合には、その範囲をログに出力し、見つからなかった場合にはそれをユーザーに通知しています。

○特定の範囲での検索

また、rangeOfStringメソッドを使用する際に、メインストリングの特定の範囲でのみ検索を行うことも可能です。

これにより、大きな文字列の中でも特定の部分に対してのみ検索を絞り込むことができます。

NSString *mainString = @"Objective-CのrangeOfStringのカスタマイズ方法を学ぼう。";
NSString *searchString = @"方法";
NSRange searchRange = NSMakeRange(0, 20); // 最初の20文字だけで検索する
NSRange foundRange = [mainString rangeOfString:searchString options:0 range:searchRange];

if (foundRange.location != NSNotFound) {
    NSLog(@"指定された範囲内で見つかりました: %@", NSStringFromRange(foundRange));
} else {
    NSLog(@"指定された範囲内では該当する文字列は見つかりませんでした。");
}

このコードでは、searchRange変数を使用してメインストリングの最初の20文字だけに検索範囲を限定しています。

このように範囲を指定することで、検索処理のパフォーマンスを向上させるとともに、より制御された検索結果を得ることが可能です。

○ロケールに基づいた検索

rangeOfStringメソッドは、検索時にロケールを考慮することで、特定の言語や文化的なルールに基づいた検索を行うこともできます。

これは、多言語をサポートするアプリケーションを開発する際に特に有用です。

ここではロケールを指定して検索を行う方法のコード例を紹介します。

NSString *mainString = @"Objective-CのrangeOfStringのカスタマイズ方法を学ぼう。";
NSString *searchString = @"rangeofstring";
NSRange range = [mainString rangeOfString:searchString
                                  options:NSCaseInsensitiveSearch
                                    range:NSMakeRange(0, mainString.length)
                                   locale:[NSLocale currentLocale]];

if (range.location != NSNotFound) {
    NSLog(@"ロケールに基づいた検索で見つかりました: %@", NSStringFromRange(range));
} else {
    NSLog(@"ロケールに基づいた検索では該当する文字列は見つかりませんでした。");
}

この例では、NSLocaleクラスのcurrentLocaleメソッドを使用して、現在のユーザーのロケール設定に基づいた検索を実行しています。

これにより、ユーザーの言語や地域に合わせたより精密な検索が可能となります。

まとめ

Objective-CのrangeOfStringメソッドを使った文字列処理は、プログラミング初心者にとって、その柔軟性と強力な機能でコードの多くの問題を解決する鍵となります。

本ガイドでは、基本的な使用方法から始めて、様々なカスタマイズ方法を紹介しました。

これにより、rangeOfStringメソッドの多用途性とその応用の幅広さを理解いただけたことでしょう。

今回学んだrangeOfStringの知識とテクニックを活用して、Objective-Cにおける文字列操作の精度を高め、より良いアプリケーション開発に役立ててください。