Objective-Cの三項演算子!10の具体的な使用例とカスタマイズ方法

Objective-Cの三項演算子を図解したイメージObjctive-C
この記事は約15分で読めます。

 

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

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

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

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

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

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

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

はじめに

Objective-Cを使用するプログラマーや開発者の中には、特定の構文や演算子について深く理解していない場合があります。

その中でも、「三項演算子」という項目は、他の言語にも共通して存在するものの、初心者には少し取っつきにくいと感じるかもしれません。

この記事では、Objective-Cの三項演算子を中心に、その基本的な使い方や応用例、さらにはカスタマイズ方法まで、詳細にわたって解説していきます。

サンプルコードを交えながら、初心者でもスムーズに理解できる内容を心掛けていますので、ぜひ最後までお読みください。

●Objective-Cの三項演算子とは

三項演算子は、その名の通り、3つのオペランドを取る特殊な演算子です。具体的には「条件 ? 値1 : 値2」という形式を取ります。

これは、「条件が真であれば値1を返し、そうでなければ値2を返す」という意味になります。

この演算子は、if文と同じような条件分岐の機能を持っていますが、より簡潔に書くことができるのが特徴です。

Objective-Cにおいても、他の多くのプログラミング言語と同様に、三項演算子はサポートされています。

しかし、この演算子を使う際には、適切な場面や方法で使用することが重要です。

不適切に使用すると、コードの可読性が低下する恐れがあります。

○三項演算子の基本的な概念

Objective-Cの三項演算子の使用方法を理解するための基本的な概念を紹介します。

  1. 条件式:三項演算子の最初の部分には、評価したい条件式を記述します。この条件式が真であれば、次に続く値1が選択され、偽であれば値2が選択されます。
  2. 真の場合の値(値1):条件式が真と評価された場合に返される値をここに記述します。
  3. 偽の場合の値(値2):条件式が偽と評価された場合に返される値をここに記述します。

このように、三項演算子は、簡単な条件分岐をコード上で簡潔に表現するための便利なツールとなっています。

ただし、この演算子を使用する際には、コードの可読性やメンテナンス性を考慮することも大切です。

過度な使用や複雑な条件式の中での利用は、コードの理解を難しくする可能性があります。

●三項演算子の基本的な使い方

三項演算子は、ある条件式を評価し、その結果に応じて2つの異なる値のいずれかを返すことができる演算子です。

基本的な構文は次のようになります。

条件式 ? 真の場合の値 : 偽の場合の値

このコードでは、条件式を評価して、真の場合には真の場合の値を、偽の場合には偽の場合の値を返します。

この例では、条件式を評価して、その結果に基づいて適切な値を選択して返す動作を示しています。

○サンプルコード1:基本的な条件判定

例えば、ある数値が10以上かどうかを判定し、10以上なら「大」と、それ未満なら「小」という文字列を返すといった場合のコードは次のようになります。

int number = 12;
NSString *result = (number >= 10) ? @"大" : @"小";
NSLog(@"%@", result);

このコードでは、数値numberが10以上かどうかの条件式を三項演算子で評価しています。

この例では、12は10以上なので、「大」という文字列をresult変数に代入し、それを表示しています。

このコードを実行すると、出力結果として「大」という文字列が得られます。

○サンプルコード2:数値の大小比較

さらに、2つの数値の大小を比較し、大きい方の数値を返す場合のコードは次のようになります。

int a = 5;
int b = 8;
int largerValue = (a > b) ? a : b;
NSLog(@"%d", largerValue);

このコードでは、2つの数値abの大小を三項演算子で比較しています。

この例では、5と8の2つの数値を比較し、8の方が大きいため、largerValue変数には8が代入されます。

このコードを実行すると、出力結果として8という数値が得られます。

○サンプルコード3:文字列の比較

三項演算子は数値だけでなく、文字列の比較にも使用することができます。

例として、2つの文字列が同じかどうかを判定し、同じ場合は「同じ」と、異なる場合は「異なる」という文字列を返すコードは以下の通りです。

NSString *string1 = @"apple";
NSString *string2 = @"orange";
NSString *comparisonResult = [string1 isEqualToString:string2] ? @"同じ" : @"異なる";
NSLog(@"%@", comparisonResult);

このコードでは、string1string2という2つの文字列を比較しています。

この例では、「apple」と「orange」という2つの文字列は異なるため、comparisonResult変数には「異なる」という文字列が代入されます。

このコードを実行すると、出力結果として「異なる」という文字列が得られます。

●三項演算子の応用例

Objective-Cの三項演算子は、他の多くのプログラミング言語にも共通する、非常に便利な機能の一つです。

特に、条件に応じて異なる値を返したい場合や、コードの簡潔化を図りたい場合に重宝します。

ここでは、三項演算子の応用例をいくつか紹介していきます。

○サンプルコード4:配列の要素の存在確認

このコードでは、配列に特定の要素が存在するかどうかを確認するコードを表しています。

この例では、NSStringの配列内に”apple”という文字列が存在するかどうかを確認しています。

NSArray *fruits = @[@"banana", @"apple", @"orange"];
NSString *result = [fruits containsObject:@"apple"] ? @"存在する" : @"存在しない";

このコードを実行すると、result変数には”存在する”という文字列が代入されます。

なぜなら、”apple”という文字列はfruits配列内に存在しているからです。

○サンプルコード5:オプショナル変数のnil判定

Objective-Cにおけるオプショナル変数は、nilか実際の値を持つことができます。

このコードでは、オプショナル変数がnilかどうかを確認するコードを表しています。

この例では、NSStringのオプショナル変数がnilであるか、実際の値を持つかを判定しています。

NSString *optionalString = nil;
NSString *result = optionalString ? optionalString : @"デフォルトの文字列";

このコードを実行すると、result変数には”デフォルトの文字列”という文字列が代入されます。

これは、optionalString変数がnilであるため、三項演算子の後半部分が評価されるからです。

○サンプルコード6:オブジェクトの属性の判定

Objective-Cでは、オブジェクトの属性や状態に基づいて処理を分岐させる場面がよくあります。

ここでは、三項演算子を用いてオブジェクトの属性を簡単に判定する方法を紹介します。

@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age;
@end

Person *person = [[Person alloc] init];
person.name = @"Taro";
person.age = 25;

NSString *message = person.age >= 20 ? @"成人です" : @"未成年です";
NSLog(@"%@", message);

このコードではPersonというクラスを定義し、その中にnameageという属性を持たせています。

次に、Personクラスのインスタンスを作成し、name"Taro"age25をセットしています。

三項演算子の部分で、person.age >= 20 ? @"成人です" : @"未成年です"という式を使って、ageの属性値によってメッセージを分岐しています。

この例では、personオブジェクトのage属性が20以上であれば"成人です"、そうでなければ"未成年です"という文字列を返しています。

このコードを実行すると、コンソールには「成人です」と表示されるでしょう。

なぜなら、personオブジェクトのage属性は25で、これは20以上なので条件が真と評価されるからです。

○サンプルコード7:計算結果に基づく条件判定

計算の結果に基づく判定も、三項演算子を利用してシンプルに書くことができます。

下記のサンプルコードでは、2つの数値を加算した結果に応じて、メッセージを切り替える例を見てみましょう。

NSInteger number1 = 7;
NSInteger number2 = 5;
NSInteger sum = number1 + number2;

NSString *resultMessage = sum > 10 ? @"合計は10より大きい" : @"合計は10以下";
NSLog(@"%@", resultMessage);

このコードでは、number1number2という2つの変数に数値をセットし、その合計をsumという変数に保存しています。

三項演算子の部分で、sum > 10 ? @"合計は10より大きい" : @"合計は10以下"という式を使って、計算結果に応じたメッセージを分岐しています。

この例では、計算結果のsumが10より大きい場合は"合計は10より大きい"というメッセージを、そうでない場合は"合計は10以下"というメッセージを返しています。

このコードを実行すると、コンソールには「合計は10より大きい」と表示されるでしょう。

なぜなら、number1number2の合計は12であり、これは10より大きいからです。

○サンプルコード8:関数の戻り値に基づく条件判定

Objective-Cの三項演算子は非常に強力で、関数の戻り値に基づいた条件判定も可能です。

関数の戻り値によって、異なる結果を取得することができます。

このコードでは、関数の戻り値を用いて三項演算子を使った条件判定を行っています。

この例では、数値を返す関数を使用し、その数値が10以上か以下かで異なる文字列を返す動作をしています。

#import <Foundation/Foundation.h>

NSString* checkNumber(int number) {
    return number >= 10 ? @"10以上です" : @"10未満です";
}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        int result = arc4random() % 20;
        NSLog(@"%@", checkNumber(result));
    }
    return 0;
}

上記のコードを実行すると、arc4random() % 20によって0から19までのランダムな数値が生成され、その数値が10以上か10未満かによって、”10以上です”または”10未満です”という文字列が出力されます。

○サンプルコード9:ループ内での条件判定

三項演算子はループの中での条件判定にも使用できます。

例として、配列の中の各要素が奇数か偶数かを判定するサンプルコードを考えてみましょう。

このコードでは、配列内の各要素をループで回し、その数値が奇数か偶数かを三項演算子を使って判定しています。

この例では、配列の各要素を確認し、それが奇数か偶数かを出力しています。

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSArray *numbers = @[@1, @2, @3, @4, @5, @6, @7, @8, @9, @10];
        for (NSNumber *num in numbers) {
            NSLog(@"%@", [num intValue] % 2 == 0 ? @"偶数" : @"奇数");
        }
    }
    return 0;
}

上記のコードを実行すると、配列内の各数値が奇数か偶数かを順に出力します。

○サンプルコード10:複数の条件を組み合わせた判定

三項演算子は、複数の条件を組み合わせた複雑な判定にも使用できます。

例として、数値が正、負、0のいずれであるかを判定するサンプルコードを考えてみましょう。

このコードでは、複数の三項演算子を組み合わせて、数値が正、負、0のいずれであるかを判定しています。

この例では、数値を入力として受け取り、その数値が正、負、0のいずれであるかを出力しています。

#import <Foundation/Foundation.h>

NSString* checkValue(int number) {
    return number > 0 ? @"正の数" : (number < 0 ? @"負の数" : @"0");
}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        int input = 5; // この値を変更して試すことができます。
        NSLog(@"%@", checkValue(input));
    }
    return 0;
}

上記のコードを実行すると、入力した数値が正、負、0のいずれであるかを出力します。

入力の値を変更して試すことで、異なる結果が得られることを確認することができます。

●三項演算子の注意点と対処法

三項演算子はその名の通り、3つの要素を取る演算子です。

しかし、この便利な演算子を使用する際には、以下の点を注意しなければならないことがあります。

○過度な使用によるコードの可読性の低下

三項演算子はコンパクトで、短いコードで条件を判定することができます。

しかし、これを過度に使用すると、コードが複雑になり、可読性が低下することがあります。

このコードでは、三項演算子を使って、数値の大小を判定し、結果を文字列で返しています。

この例では、aとbの大小を判定して、大きい方の数値を文字列で返しています。

int a = 5;
int b = 3;
NSString *result = (a > b) ? @"aが大きい" : @"bが大きい";

この例のように、単純な条件判定には三項演算子が適しています。

しかし、条件が多くなったり、ネストが深くなったりすると、コードの可読性が低下することがあります。

○ネストした三項演算子の扱い

三項演算子をネストして使用すると、コードが非常に読みづらくなる可能性があります。

ネストとは、三項演算子の中でさらに三項演算子を使用することを指します。

下記のコードは、a, b, cの3つの数値の中で最も大きい数値を判定しています。

int a = 5;
int b = 7;
int c = 6;
NSString *result = (a > b) ? ((a > c) ? @"aが最も大きい" : @"cが最も大きい") : ((b > c) ? @"bが最も大きい" : @"cが最も大きい");

このように、ネストを深くするとコードが複雑になり、エラーの原因となることもあります。

ネストを避けるためには、if文やswitch文を使って条件を判定する方が適している場合もあります。

○型の違う値を返す場合の注意点

三項演算子を使用する際、条件に応じて異なる型の値を返そうとすると、コンパイルエラーが発生することがあります。

例えば、下記のコードでは、条件に応じて数値か文字列を返そうとしています。

int number = 5;
id result = (number > 10) ? @"数値は10より大きい" : 0;

この場合、返す値の型が一致していないため、エラーが発生します。

この問題を解決するためには、返す値の型を統一するか、適切なキャストを行う必要があります。

●三項演算子のカスタマイズ方法

Objective-Cの三項演算子は非常に便利なツールですが、そのままの形で使用する場合、多少の制約が生じることがあります。

ここでは、三項演算子のさらなるカスタマイズ方法を2つのアプローチから学びます。

○カスタム関数と組み合わせる

三項演算子をより柔軟に使用するためには、カスタム関数と組み合わせる方法が考えられます。

この方法では、三項演算子の中で独自の関数を呼び出し、より複雑な判定や処理を行うことができます。

このコードでは、数値を受け取り、それが偶数か奇数かを判断するカスタム関数を作成し、三項演算子の中でその関数を呼び出しています。

この例では、数値を偶数、奇数のどちらであるかを判断しています。

#import <Foundation/Foundation.h>

// 偶数か奇数かを判定するカスタム関数
NSString* isEvenOrOdd(int number) {
    return (number % 2 == 0) ? @"偶数" : @"奇数";
}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        int num = 5;
        NSLog(@"%dは%@", num, isEvenOrOdd(num));
    }
    return 0;
}

このコードを実行すると、数値5が奇数であることがコンソールに表示されます。

このように、カスタム関数と三項演算子を組み合わせることで、より詳細な判定や複雑な処理を行うことができます。

○拡張機能やライブラリを利用する

Objective-Cには多くのライブラリやフレームワークが存在しており、これらを利用することで、三項演算子の機能を拡張することができます。

例として、外部ライブラリを利用して、三項演算子の中で特定のオブジェクトの属性や状態を確認し、それに基づいて処理を分岐する方法を考えます。

ここでは具体的なライブラリの名前やコードを紹介するわけではありませんが、使用するライブラリやフレームワークのドキュメントを参照しながら、三項演算子のカスタマイズを進めることができます。

Objective-Cの三項演算子はそのままの形でも非常に便利ですが、上述の方法を取り入れることで、さらにその可能性を広げることができます。

カスタム関数や外部ライブラリを駆使して、三項演算子を自分のニーズに合わせてカスタマイズしてみましょう。

まとめ

Objective-Cの三項演算子はプログラミングの中で非常に役立つツールとなります。

この記事では、三項演算子の基本的な使い方や応用例を通じて、その使い方の幅を広げる方法を解説しました。

特に、カスタム関数との組み合わせや外部ライブラリを利用することで、三項演算子の機能をより拡張することが可能です。

これらのテクニックを駆使し、効率的なコード作成を目指しましょう。

Objective-Cを学び始めた方や、より高度な技術を求める方にも役立つ内容となっておりますので、日常のプログラミングに積極的に取り入れてください。