Objective-Cで比較演算子を使いこなす方法5選

Objective-Cのコード例と比較演算子の説明を含む画像Objctive-C
この記事は約18分で読めます。

 

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

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

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

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

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

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

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

はじめに

プログラミングにおいて、データの比較は基本中の基本です。特にObjective-Cを学ぶ上で、比較演算子の理解は不可欠です。

この記事では、Objective-Cの比較演算子を用いたデータ比較の方法を5つ紹介し、初心者でも理解しやすいように解説します。

○Objective-Cとは

Objective-Cは、C言語をベースにSmalltalkのオブジェクト指向機能が追加されたプログラミング言語です。

AppleのMac OS XやiOSのアプリケーション開発に長らく使用されてきました。そのため、iOSアプリを開発するうえで、Objective-Cの知識は重要とされています。

○比較演算子の基本

比較演算子とは、二つの値を比較して、その結果が真(true)か偽(false)かを返す演算子です。

Objective-Cにおける比較演算子には、「==」(等しい)、「!=」(等しくない)、「>」(より大きい)、「<」(より小さい)、「>=」(以上)、「<=」(以下)などがあります。

これらの演算子は条件分岐やループの制御など、プログラムの流れを決定する上で欠かせない要素です。

●Objective-Cの比較演算子の使い方

Objective-Cにおける比較演算子はプログラムの制御フローに不可欠で、条件分岐やループ制御など様々な場面で利用されます。

比較演算子には主に、等価(==)、不等価(!=)、大きい(>)、小さい(<)、以上(>=)、以下(<=)があります。

これらの演算子を使用して、変数または式の比較結果に基づいて、ブール値(YESまたはNO)を返します。

例えば、ユーザーの入力が特定の範囲内にあるかどうかをチェックしたり、二つのオブジェクトが同じ値を持つかどうかを評価したりする際に使用します。

○サンプルコード1:等価比較

ここでは、Objective-Cでの等価比較の例を見てみましょう。

等価比較演算子”==”は、二つのオペランドが等しい値を持っているかどうかをチェックします。

下記のコードでは、二つの整数値が等しいかどうかを確認しています。

int numberOne = 10;
int numberTwo = 10;

if (numberOne == numberTwo) {
    NSLog(@"両方の数値は等しいです。");
} else {
    NSLog(@"両方の数値は等しくありません。");
}

このコードでは、整数型の変数numberOneとnumberTwoに10という同じ値を割り当てています。

if文の中で、これら二つの変数が等しいかどうかを”==”演算子を使って比較しています。

もし条件が真であれば、”両方の数値は等しいです。”というメッセージをログに出力し、条件が偽であれば、”両方の数値は等しくありません。”と出力されます。

実際に上のコードを実行すると、numberOneとnumberTwoが同じ値であるため、ログには”両方の数値は等しいです。”と表示されます。

○サンプルコード2:不等比較

次に、不等比較演算子”!=”について見てみましょう。

この演算子は二つのオペランドが異なる値を持っているかどうかをチェックします。

下記の例では、二つの異なる文字列オブジェクトが同じ値を持つかどうかを評価しています。

NSString *stringOne = @"Apple";
NSString *stringTwo = @"Orange";

if (![stringOne isEqualToString:stringTwo]) {
    NSLog(@"両方の文字列は異なります。");
} else {
    NSLog(@"両方の文字列は同じです。");
}

ここではNSStringクラスのisEqualToStringメソッドを使用していますが、これはObjective-Cにおける文字列の比較で一般的な方法です。

“!=”演算子は、単純な数値の比較だけでなく、メソッドの戻り値を用いた論理否定にも使われます。

この例では、stringOneが”Apple”、stringTwoが”Orange”と異なる値であるため、if文の条件は真と評価され、”両方の文字列は異なります。”というメッセージがログに出力されます。

上記のコードを実行した場合、stringOneとstringTwoが異なる文字列を参照しているため、出力結果は”両方の文字列は異なります。”となります。

○サンプルコード3:大なり小なりの比較

Objective-Cでの「大なり」と「小なり」の比較演算子は、整数や浮動小数点数などの比較に使われます。

例えば、変数の値を比較して、一方が他方より大きいか小さいかを評価するときに活用できます。

この演算子は非常に基本的ですが、プログラムのロジックを制御する上で重要な役割を果たします。

ここでは、Objective-Cで「大なり」または「小なり」の比較を行うサンプルコードを紹介します。

int a = 10;
int b = 20;

if (a > b) {
    NSLog(@"aはbより大きい");
} else {
    NSLog(@"aはbより小さいまたは等しい");
}

if (a < b) {
    NSLog(@"aはbより小さい");
} else {
    NSLog(@"aはbより大きいまたは等しい");
}

このコードでは、二つの整数変数 ab を比較しています。最初の if 文では a > b を評価し、その後の else ブロックでは ab と等しいか、もしくは b より小さい場合の処理をしています。

同様に二つ目の if 文では a < b の評価を行い、対応する else ブロックでその他の条件を処理しています。

コードを実行すると、ab より小さいため、次の出力が得られます。

aはbより小さいまたは等しい
aはbより小さい

Objective-Cでは、このような基本的な比較演算子を使用して条件分岐を行います。

特にループや決定木の構築時には、これらの比較演算子がコードの挙動を決定づけるため、正確な条件式を書くことが不可欠です。

○サンプルコード4:複合比較演算子の使用

複合比較演算子は、二つ以上の条件を同時に評価するのに使用されます。

Objective-Cでの複合比較は、&&(AND演算子)と ||(OR演算子)を使用して実現されます。

AND演算子は、すべての条件が真である場合に真を返します。一方、OR演算子は、少なくとも一つの条件が真であれば真を返します。

下記のサンプルコードでは、複合比較演算子を使って複数の条件を評価しています。

int a = 10;
int b = 20;
int c = 30;

if (a < b && b < c) {
    NSLog(@"aはbより小さく、bはcより小さい");
}

if (a > b || a < c) {
    NSLog(@"aはbより大きい、またはaはcより小さい");
}

このコードでは、最初の if 文で ab より小さく、かつ bc より小さいかどうかをチェックしています。

二番目の if 文では、ab より大きい、または ac より小さい条件を評価しています。

実行結果として次のメッセージがコンソールに表示されます。

aはbより小さく、bはcより小さい
aはbより大きい、またはaはcより小さい

このように、複合比較演算子を用いることで、より複雑な条件の組み合わせを簡単に検証できます。

○サンプルコード5:nilとの比較

Objective-Cでは、オブジェクトがnilかどうかを確認する際に比較演算子を使用します。

nilは、オブジェクトが何も参照していないことを意味します。

これは、オブジェクトが存在しないか、初期化されていない場合にしばしば見られます。

ここでは、nilとの比較を行うサンプルコードを紹介します。

id someObject = nil;

if (someObject == nil) {
    NSLog(@"someObjectはnilです");
} else {
    NSLog(@"someObjectはnilではありません");
}

ここでは、id 型の変数 someObject をnilと比較しています。

id はObjective-Cでの汎用型で、任意のオブジェクトを指すことができます。

if 文で someObject がnilかどうかを評価し、結果に基づいて適切なメッセージをNSLogで出力しています。

実行すると、someObject がnilであるため、次の結果が出力されます。

someObjectはnilです

nilの確認はObjective-Cでのプログラミングでは一般的な作業であり、特にオブジェクトがメソッドの戻り値としてnilを返すかどうか、またはオブジェクト参照後に何らかの理由でオブジェクトが解放されているかどうかをチェックする際に役立ちます。

●比較演算子の詳細な対処法

比較演算子を使用する際には、しばしば型の不一致や、浮動小数点数の扱いなど、予期しない問題に遭遇することがあります。

Objective-Cでは、これらの問題に対処するためにも、正しい比較演算子の選択とその使い方の理解が不可欠です。

○比較演算子と型の不一致

Objective-Cで異なる型間の比較を行う際には、型変換を適切に行うことが重要です。

たとえば、整数型と浮動小数点型を比較する場合、片方の型をもう片方の型にキャストして比較を行う必要があります。

このプロセスを怠ると、誤った比較結果につながる可能性があります。

ここでは、int型の変数とfloat型の変数を比較しています。

この例では、明示的に型変換を行い、正しい比較を実現しています。

int intValue = 10;
float floatValue = 10.0f;

// int型をfloat型に変換して比較
if ((float)intValue == floatValue) {
    NSLog(@"両者は等しい");
} else {
    NSLog(@"両者は等しくない");
}

このコードでは、intValueをfloat型にキャストし、floatValueと等しいかどうかを比較しています。

等価演算子==は両辺の値が同じであればtrueを返し、そうでなければfalseを返します。

実行結果として、両者が等しい場合はコンソールに「両者は等しい」と表示されます。

○浮動小数点数の比較

浮動小数点数の比較は特に注意が必要です。

コンピューターは浮動小数点数を二進数で近似的に表現するため、誤差が生じることがあります。

従って、浮動小数点数を直接比較する代わりに、許容される誤差範囲内での比較を行うことが一般的です。

ここでは、二つの浮動小数点数が実質的に等しいかを確認する方法を表しています。

float firstValue = 0.15f + 0.15f;
float secondValue = 0.1f + 0.2f;

// 比較のための小さな誤差の範囲(イプシロン)
float epsilon = 0.0001f;

// 絶対値を取得するには fabs 関数を使用
if (fabs(firstValue - secondValue) < epsilon) {
    NSLog(@"両者は実質的に等しい");
} else {
    NSLog(@"両者は実質的に等しくない");
}

このコードでは、firstValuesecondValueが実質的に等価であるかを評価しています。

epsilonは比較のために使用される、許容可能な最小の誤差の値です。

結果として、誤差がepsilon以下であれば、「両者は実質的に等しい」という結果が得られます。

●注意点

Objective-Cの比較演算子を使用する際にはいくつかの注意点があります。

これらのポイントを押さえることで、コードのバグを減らし、より効率的なプログラミングが可能になります。

○比較演算子の誤用

Objective-Cでの比較演算子の誤用は一見すると小さな問題に見えますが、アプリケーションのロジックに深刻な影響を与える可能性があります。

たとえば、下記のサンプルコードでは、ポインタ型の変数がNULL(またはnil)でないことを確認していますが、それだけでなくポインタが指す値の比較も行っている点に注意してください。

// 文字列ポインタの比較
NSString *stringA = @"Hello";
NSString *stringB = @"Hello";

if (stringA != nil && stringB != nil) {
    if ([stringA isEqual:stringB]) {
        NSLog(@"stringAとstringBは等しい内容です。");
    } else {
        NSLog(@"stringAとstringBは異なる内容です。");
    }
} else {
    NSLog(@"stringAまたはstringBのどちらかがnilです。");
}

このコードでは、まず二つの文字列ポインタstringAstringBnilでないことを確認した後、isEqual:メソッドを使用しています。

この例ではstringAstringBが同じ内容(ここでは文字列”Hello”)を持っているかどうかを比較しており、isEqual:メソッドはNSStringクラスが提供する内容比較のためのメソッドです。

これにより、メモリアドレスではなく内容が等しいかどうかを判断できます。

実行すると、”stringAとstringBは等しい内容です。”という結果が得られます。

これはstringAstringBが同じ文字列リテラルを指しているためです。

しかし、これがもし異なるインスタンスを指していたら、結果は異なる内容となります。

そのため、ポインタの比較には細心の注意が必要です。

○パフォーマンスへの影響

Objective-Cの比較演算子を使用するときには、パフォーマンスへの影響も考慮する必要があります。

特に大きなデータ構造や多数の要素を持つ配列を扱う場合、比較処理が性能のボトルネックになることがあります。

それぞれの比較がシンプルであっても、これらが何千、何万回と繰り返されると、全体のパフォーマンスに顕著な影響を及ぼす可能性があります。

そのため、ループ内での比較演算子の使用や、必要以上に複雑な条件式の使用は避けるべきです。

このように、Objective-Cでの比較演算子の使用は、プログラミングにおける論理的思考と注意深い実装を要求します。

基本的な原則と注意点を理解することで、より堅牢なアプリケーションの開発が可能になります。

●比較演算子の応用例

Objective-Cでは比較演算子を用いて、変数間の比較や、条件文での分岐処理など、多様な場面で利用されます。

例えば、アプリ開発においてユーザーの入力した年齢が特定の範囲にあるかをチェックしたり、オブジェクトの状態に応じて処理を変えたりする場合などです。

ここでは、Objective-Cでの比較演算子の応用例をいくつか紹介し、実際にプログラム上でどのように使いこなすかを説明します。

○サンプルコード6:条件文での活用

Objective-Cにおける条件文での活用方法は、if文やswitch文といった制御構造と組み合わせることで実現されます。

int score = 85;
NSString *grade;

if (score >= 90) {
    grade = @"S";
} else if (score >= 80) {
    grade = @"A";
} else if (score >= 70) {
    grade = @"B";
} else if (score >= 60) {
    grade = @"C";
} else {
    grade = @"F";
}
NSLog(@"Grade: %@", grade);

このコードでは、まず整数型の変数scoreに85という値を代入しています。

その後の条件文では、scoreが90以上であれば変数gradeに”S”を、80以上であれば”A”を、というように判定し、それに応じた評価をgrade変数に格納しています。

最後に、gradeの内容をコンソールに出力することで、評価の結果を確認できます。

この例では、スコアに応じた成績の評価を文字列で分類しています。

最終的にこのコードを実行すると、コンソールには「Grade: A」と表示されます。

なぜなら、score変数の値は90未満であるものの80以上であるため、”A”の評価を受けるからです。

○サンプルコード7:配列の要素比較

配列の要素同士の比較も、Objective-Cでよく用いられる比較の形式の一つです。

次の例では、NSArrayの要素を比較して特定の条件を満たす要素の数を数えます。

NSArray *ages = @[@25, @32, @17, @40];
int count = 0;
for (NSNumber *age in ages) {
    if ([age intValue] > 30) {
        count++;
    }
}
NSLog(@"30歳を超える人の数: %d", count);

このコードでは、NSNumberオブジェクトを要素に持つNSArrayを作成しています。

for-inループを使って配列の各要素にアクセスし、intValueメソッドを使用してNSNumberからint型の値を取得し、30を超える値のものを数えています。

ログ出力によって、30歳を超える人の数をコンソールに表示します。

このサンプルコードの実行結果としては、「30歳を超える人の数: 2」とコンソールに表示されます。

これは、配列内の要素で30歳を超えるものが2つ含まれているためです。

●カスタマイズ方法

プログラミングにおけるカスタマイズ方法の中でも、特に比較演算子を独自にカスタマイズすることは、Objective-Cを用いたアプリケーション開発での柔軟性と拡張性を高める上で非常に重要です。

Objective-Cでは、標準的な比較演算子(==, !=, >, <, >=, <=)以外にも、特定のデータ型やオブジェクトのためのカスタム比較ロジックを定義することが可能です。

これにより、開発者はデータの比較において、より複雑な条件やカスタムクラスの特性に適したロジックを実装することができます。

Objective-Cにおけるカスタマイズの一般的な方法として、メソッドのオーバーライドやオペレータのオーバーロードがありますが、Objective-CはCベースの言語であるため、オペレータのオーバーロードはサポートされていません。

代わりに、カスタムクラス内に特定の比較を行うためのメソッドを定義し、それを使用してオブジェクト間の比較を行います。

これにより、クラス固有の振る舞いやプロパティに基づく比較が可能となります。

○自己定義比較演算子の作成

Objective-Cで自己定義比較演算子を作成するためには、カスタムクラスに比較メソッドを定義する必要があります。

たとえば、Employeeクラスがあり、各従業員を年齢で比較したい場合、Employeeクラスには次のような比較メソッドを実装します。

@interface Employee : NSObject

@property (assign, nonatomic) NSInteger age;

- (NSComparisonResult)compareAge:(Employee *)otherEmployee;

@end

@implementation Employee

- (NSComparisonResult)compareAge:(Employee *)otherEmployee {
    if (self.age < otherEmployee.age) {
        return NSOrderedAscending;
    } else if (self.age > otherEmployee.age) {
        return NSOrderedDescending;
    } else {
        return NSOrderedSame;
    }
}

@end

このコードではEmployeeクラスにageプロパティとcompareAge:メソッドを定義しています。

この例ではcompareAge:メソッドを用いて、引数として受け取ったotherEmployeeオブジェクトのageプロパティと自身のageを比較し、NSComparisonResult型の値を返しています。

NSComparisonResultは比較の結果を表す値であり、NSOrderedAscendingNSOrderedDescending、またはNSOrderedSameを返します。

このメソッドを使用することで、2つのEmployeeオブジェクト間の年齢比較が可能になります。

例えば、2つの従業員インスタンスを比較する場合は次のようになります。

Employee *employee1 = [[Employee alloc] init];
employee1.age = 30;
Employee *employee2 = [[Employee alloc] init];
employee2.age = 25;

NSComparisonResult result = [employee1 compareAge:employee2];
if (result == NSOrderedAscending) {
    // employee1はemployee2より年齢が若い
} else if (result == NSOrderedDescending) {
    // employee1はemployee2より年齢が上
} else {
    // employee1とemployee2の年齢は同じ
}

ここで、employee1ageを30、employee2ageを25と設定し、compareAge:メソッドを呼び出しています。

その結果、employee1employee2よりも年齢が若いため、NSOrderedAscendingが返されます。

まとめ

Objective-Cにおける比較演算子はプログラミングにおける判断の基礎をなし、効果的なコードの書き分けには不可欠です。

本記事では、Objective-Cの比較演算子を用いたコードの書き方を5つの方法で解説しました。

本ガイドで提供されたサンプルコードは、具体的な例を表すことにより、初心者でもObjective-Cの比較演算子の使い方を理解しやすくすることを目的としています。

プログラミングを学ぶ過程で出会う様々な課題に、これらの知識が光を当て、より高度なコードの書き方へと進んでいく手助けになればと思います。