*

Xcode&Objective-Cの文字列処理をユニットテスト(XCTestフレームワーク)で確認する。[NSStringの定義、分割、検索]

公開日: : 最終更新日:2014/06/30 Objective-C , ,


スポンサードリンク



文字列の処理、操作は、どの言語でプログラムを作成するにしても重要で欠かせないものです。

Objective-CのNSStringとNSMutableStringの主要な機能を数回にわたり
「ユニットテスト」を作成&実行しながら、説明させていただこうと考えております。
利用するのは、XCTestテストフレームワークとなります。

利用しているXcodeはXcode5(5.1)となります。

ユニットテストに関しては
「Xcode5でUnitTestを利用してみる。」をまずはご覧いただければ幸いです。

第一回は

を説明させていただきます。

第二回は文字列の比較処理を予定しております。

 

NSStringの説明

Objective-Cにおける文字列を扱うクラスです。
一度セットした文字列は変更できないイミュータブルなクラスです。
それに対して、NSMutableStringは変更可能なミュータブルなクラスです。

イミュータブルといえども、セットした値を編集できないだけで、参照自体を置き換えることは可能です。
もっと簡単に表現すると、NSStringに文字列を一度セット、再度異なる文字列を代入することです。

NSStringの宣言方法と長さの取得

定義のみ

定義のみした場合、NSStringはオブジェクトなのでnilになります。

普通の文字列を指定して作成

文字列を指定する場合は、値は@”文字列”の形式で指定します。

フォーマットを指定して文字列を作成

NSStringのstringWithFormat:メソッドを利用することで、フォーマット指定で文字列を作成できます。
フォーマットに埋め込む事ができる置換文字列は、以下の物が利用可能です。

  • %@ NSString型
  • %d 数値型
  • %f 小数型
  • %% “%”自体を扱いたい時

実際の利用例は以下の通りです。

実行すると、あれ!、失敗しました。
スクリーンショット 2014-05-19 19.37.48

あ!、思い出しました。オブジェクト型の比較はXCTAssertEqualではなく、
XCTAssertEqualObjectsを利用しないといけないんでした。

XCTAssertEqualObjectsに変更して、再度実行と・・・
また失敗しました。

失敗時のメッセージは以下の通りでした。
failed: (“今日は5月17日でした。平均気温は19.87でした。”) is not equal to (“今日は5月17日でした。平均気温は19.870000でした。”)

%fが思ったように置換されてませんね・・・、小数点2桁で置換されるように%.2fに書き換えてみます。

テストも成功しました。
スクリーンショット 2014-05-19 19.48.13

NSStringの長さの取得

lengthメソッドで取得可能です。
なお、lengthメソッドが返却する文字数は、純粋な文字数(全角、半角ともに1文字としてカウント)です。

問題なくテストは成功しました。

componentsSeparatedByString:メソッド(文字列を分割)

componentsSeparatedByString:メソッドを用いることで、指定文字列で分割可能です。戻り値はNSArrayとなります。

上記例は分割可能な例だったのですが、分割できない(指定した文字列が含まれない)例のアサーションも追加してみます。

テストを実行すると、なんと失敗しました。
failed: (“0”) is not equal to (“1”)だそうです。分割できなかったら分割対象の文字列だけのNSArrayになるようです。

以下のように修正しテストが成功しました。

rangeOfString:メソッド(文字列を検索)

rangeOfString:メソッドを利用することで検索文字列の検索が可能です。本メソッドの戻り値はNSRangeで、
検索文字列(引数)が複数個含まれる場合は、一番始めの結果のNSRangeが返却されます。

rangeOfStringメソッドは以下の4種類があります。

  • rangeOfString:
  • rangeOfString:options:
  • rangeOfString:options:range:
  • rangeOfString:options:range:locale

optionsにはNSStringCompareOptionsの値が指定可能です。
optionsで一般的によく利用される設定値は以下の通りです。

設定値 説明
NSCaseInsensitiveSearch 大文字小文字関係なく比較
NSLiteralSearch 大文字小文字を区別して比較、分割された濁点と分割されていない濁点を異なる物として判定
NSBackwardsSearch 文字列の後ろから検索
NSAnchoredSearch 文字列の前から検索
NSNumericSearch 文字列をnumeric valueとして比較、大小比較等に利用、rangeOfStringでは利用不可

 

NSStringCompareOptionsの詳細につきましては、
「iOS Developer Library」の「NSString Class Reference」の「Search and Comparison Options」の説明をご覧ください。

rangeはNSRangeで、検索範囲を指定します。
localeはNSLocaleで、文字列を扱いたいロケールを指定します。

ますはrangeOfString:からです。
普通に検索文字列(引数)が検索対象文字列に含まれる場合を試してみます。

次は、検索文字列(引数)が検索対象文字列に含まれない場合の確認です。戻り値のNSRangeのlocationにNSNotFoundがセットされます。

次に、rangeOfString:options:を試してみますが、
先に、大文字小文字の比較方法に関して、rangeOfString:の動作はどうなっているか確認のアサーションを追加してみます。
NSNotFoundになると予想されます。

やはり、NSNotFoundでした。

次に、rangeOfString:options:です。
NSCaseInsensitiveSearchとNSLiteralSearchを確認してみます。

予想通りの結果になりました。

次にNSBackwardsSearchを確認してみます。
なおoptionsに指定する値はマスク値となっておりますので、
大文字小文字を区別して、文字列の後方から検索
大文字小文字を区別して、文字列の前方から検索

との2パターンを追加してみます。

これも思った通りに動作してくれました。

rangeOfStringの確認は一通り終わりました。

文字列の比較メソッドとrangeOfString

NSStringには文字列の比較を行うメソッドが数種類存在します。
rangeOfString:メソッドは、部分文字列を検索することを主眼に作成されておりますが、
本メソッドを使って文字列が等しいか、等しくないかの確認は行えます。

以下がその実装例です。

まあ、これが処理速度的にどうかは分かりませんが、rangeOfStringって結構万能に使えますね。


スポンサードリンク

Googleアドセンス

Googleアドセンス




関連記事

Xcode5でSchemeを利用する。[後編]

「Xcode5でSchemeを利用する。」の続きの「Xcode5でSchemeを利用する。[後編]」

記事を読む

no image

Xcode5のナビゲーションエリア[問題ナビゲータ]の使い方

Xcode5のナビゲーションエリアの使い方では、アプリ開発に最も不可欠は、プロジェクトとシンボルナビ

記事を読む

Xcodeのユーティリティエリアの使い方[ソースファイル表示時]

本エントリーでは、Xcodeの「ユーティリティエリア」の使い方を説明させていただきます。 利用

記事を読む

Xcode6からはProjectName-Prefix.pchは自動的に生成されませんが、それでもpchファイルを利用したい時の利用方法

小ネタですが、Xcode6からはProjectName-Prefix.pchは自動的に生成されなくな

記事を読む

Xcodeのユーティリティエリアの使い方[ストーリーボード表示時の「Attributes」,「Size」,「Connections」Inspector]

本エントリーでは、「Xcodeのユーティリティエリアの使い方」に引き続き、「ストーリーボード」表示時

記事を読む

Xcodeの使い方[ツールバー]

Xcode5(iOS7対応バージョンの統合開発)の「ツールバー」の使い方のエントリーとなります。

記事を読む

Xcode5のナビゲーションエリア[プロジェクト、シンボル、検索]の使い方

Objective-Cでコーディングを行うための統合開発環境のXcodeの利用方法のエントリーです。

記事を読む

Xcode(Objective-C)のデリゲートとプロトコルの使い方[前編]

Xcode(Xcode5でも同様)でアプリ開発をしていて、少し複雑な事をしようとするとデリゲートと言

記事を読む

Xcode5の「Auto Layout 」機能の使い方[基礎知識と制約(Align)の設定方法]

Xcode4から導入された「Auto Layout」ですが、使いこなせるようになるのは骨が折れます。

記事を読む

iOS(Xcode6)におけるマルチスレッド処理の実装方法[iOSのマルチスレッド処理の概要]

iOSにおけるマルチスレッド処理の実装方法を数回に分けて説明させていただきます。 開発環境のXco

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

動画で英語を学習できるiOSの無料アプリCapTubeをリリースいたしました。

個人では初となるiOSアプリをリリースいたしました。 何度もリジ

no image
Ruby on rails4系でBootstrapを利用するためのtips

MacでRuby on rails4系のBootstrapを利用しよう

no image
Java、Eclipse、JUnit関連のエントリーの移行のお知らせ

Java、Eclipse、JUnit関連のエントリーは http:/

iOS8開発者向けお勧め本紹介[詳細! Swift iPhoneアプリ開発 入門ノート Swift 1.1+Xcode 6.1+iOS 8.1対応]

iOS7開発者向けお勧め本紹介を以前に紹介させていただきまいたが、今回

Swift入門(Xcode6のXCTestフレームワークで学ぶ) 第二回「関数(メソッド)とクロージャーの利用方法」

前回はSwiftの概要をザックリと説明させていただきました。 今

→もっと見る

Optimization WordPress Plugins & Solutions by W3 EDGE
PAGE TOP ↑