Swiftの論理演算子!初心者のための10選ハンドブック

Swift論理演算子解説のイメージSwift
この記事は約17分で読めます。

 

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

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

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

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

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

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

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

はじめに

SwiftはiOSやmacOSを中心としたApple製品のアプリケーション開発に使用されるプログラミング言語です。

この言語には数多くの特徴がありますが、中でも「論理演算子」は日常のプログラム作成に欠かせない要素となっています。

この記事では、Swiftの論理演算子を初心者の方にも理解しやすく、効果的に使用できるように詳細に解説します。

この記事を読むことで、10の詳細なサンプルコードを通じて論理演算子の使い方から応用までしっかりとマスターすることができます。

初めてSwiftを学ぶ方、あるいはすでに少し経験がある方でも、論理演算子の使い方に不安や疑問を持っている方にとって、この記事は非常に役立つ情報満載の内容となっています。

それでは、Swiftの魅力ある世界へと一緒に踏み込んでいきましょう。

●Swiftの論理演算子とは

Swiftの論理演算子は、真偽値(真または偽)を操作するための演算子です。

これらの演算子を使用することで、特定の条件が真であるか、偽であるかを評価することができます。

Swiftには次の3つの主要な論理演算子があります。

  1. AND演算 (&&)
  2. OR演算 (||)
  3. NOT演算 (!)

これらの論理演算子を組み合わせることで、より複雑な条件を作成したり、データのフィルタリングや処理の流れをコントロールすることができます。

○論理演算子の基本概念

  1. AND演算 (&&):両方の条件が真である場合に真を返します。もし一方または両方の条件が偽であれば、結果は偽となります。例えば、A && Bという式があった場合、AとBの両方が真である時のみ真を返します。
  2. OR演算 (||):どちらか一方または両方の条件が真である場合に真を返します。両方の条件が偽である場合のみ、偽を返します。A || Bという式は、AまたはBが真である場合、または両方が真である場合に真を返します。
  3. NOT演算 (!):与えられた条件の逆の真偽値を返します。つまり、真であれば偽を、偽であれば真を返します。!AはAが真であれば偽を、偽であれば真を返します。

これらの基本的な論理演算子を理解することで、Swiftにおける条件判定やデータの操作が非常にスムーズに行えるようになります。

●Swiftでの論理演算子の使い方

Swiftでの論理演算子の使い方を理解することは、条件分岐や繰り返し処理、さらにはデータのフィルタリングなど、プログラムの様々な場面での処理の流れを制御する上で非常に重要です。

ここでは、Swiftにおける論理演算子の具体的な使い方をいくつかのサンプルコードを通して詳しく学んでいきましょう。

○サンプルコード1:基本的なAND演算

SwiftにおけるAND演算は、&&という記号を使用して行います。

このコードでは、AND演算を使って2つの条件がともに真である場合のみ、特定の処理を実行する方法を紹介しています。

let isSunny = true
let isHoliday = true

if isSunny && isHoliday {
    print("晴れていて、休日です!外出しましょう!")
}

この例では、isSunnyisHolidayという2つの真偽値を持つ変数を用意しています。

if文内でAND演算を行い、両方の条件が真である場合のみメッセージが出力されます。

実際に上のコードを実行すると、”晴れていて、休日です!外出しましょう!”というメッセージが表示されます。

○サンプルコード2:基本的なOR演算

次に、SwiftでのOR演算を紹介します。

OR演算は、||という記号を使用して行います。

このコードでは、OR演算を用いて、いずれかの条件が真である場合に特定の処理を実行する方法を表しています。

let isRainy = false
let hasUmbrella = true

if isRainy || hasUmbrella {
    print("雨が降っているか、傘を持っているので外出可能です。")
}

この例では、isRainyhasUmbrellaという2つの真偽値を持つ変数を用意しています。

もし雨が降っているか、傘を持っている場合には、外出することができるというメッセージが出力されます。

上のコードを実行すると、”雨が降っているか、傘を持っているので外出可能です。”というメッセージが表示されます。

○サンプルコード3:NOT演算の利用例

SwiftでのNOT演算は、特定の条件の真偽値を反転させるのに使用します。NOT演算を行うには、!という記号を使用します。

このコードでは、NOT演算を使って、ある条件が偽である場合に特定の処理を実行しています。

let isCloudy = false

if !isCloudy {
    print("曇っていません。晴天です!")
}

この例では、isCloudyという真偽値を持つ変数を用意しています。

if文内でNOT演算を行い、isCloudyの値が偽である場合、すなわち晴天である場合のみメッセージが出力されます。

上記のコードを実行すると、”曇っていません。晴天です!”というメッセージが表示されます。

NOT演算は、特定の条件が満たされない場合の動作を指定する際などに非常に役立ちます。

○サンプルコード4:組み合わせた複雑な論理演算

論理演算子は単体での利用だけでなく、複数の演算子を組み合わせて使用することも可能です。

このコードでは、AND演算、OR演算、NOT演算を組み合わせて、より複雑な条件分岐を実現する方法を紹介しています。

let isWeekend = true
let hasHomework = false
let wantsToGoOut = true

if (isWeekend || !hasHomework) && wantsToGoOut {
    print("週末であるか、宿題がないので、外出したい場合は外出できます。")
}

この例では、isWeekendhasHomeworkwantsToGoOutという3つの真偽値を持つ変数を用意しています。

条件文内では、週末であるか宿題がない場合、さらに外出したい場合のみ、外出することができるというメッセージを出力しています。

上のコードを実行すると、”週末であるか、宿題がないので、外出したい場合は外出できます。”というメッセージが表示されます。

●論理演算子の応用例

Swiftの論理演算子は、単純な条件判断だけでなく、複数の条件を組み合わせたり、さまざまなコードの構造で活用できます。

ここでは、Swiftの論理演算子を利用した具体的な応用例を詳しく紹介します。

○サンプルコード5:条件分岐での応用

条件分岐において、論理演算子を活用することで、さまざまな状態を判定して適切なアクションを実行することができます。

このコードでは、複数の条件を組み合わせて、特定の状態での処理を行います。

let temperature = 25
let isRaining = false

if temperature > 20 && !isRaining {
    print("気温が快適で雨が降っていないため、ピクニックに最適です。")
}

この例では、temperatureという変数とisRainingという真偽値を利用して、気温が20度以上で雨が降っていない場合にピクニックに最適であるというメッセージを出力しています。

実行すると、「気温が快適で雨が降っていないため、ピクニックに最適です。」というメッセージが表示されます。

○サンプルコード6:ループ内での応用

ループの中で論理演算子を使うことで、特定の条件下でのみ処理を繰り返す、あるいは処理をスキップするといった動作を実現できます。

このコードでは、配列内の要素をフィルタリングしながら繰り返し処理を行っています。

let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

for num in numbers {
    if num % 2 == 0 && num > 5 {
        print("\(num)は6以上の偶数です。")
    }
}

この例では、numbersという配列をループで回しながら、6以上の偶数だけを特定してメッセージを出力しています。

このコードを実行すると、「8は6以上の偶数です。」「10は6以上の偶数です。」といったメッセージが表示されます。

ループと論理演算子を組み合わせることで、特定の条件に合致する要素だけを効率的に取り扱うことができます。

○サンプルコード7:関数の引数としての利用

Swiftの関数では、論理演算子を引数として活用することが可能です。

これにより、関数の動作をカスタマイズすることや、さまざまな条件下での振る舞いを制御することができます。

下記のコードは、関数の引数として論理演算子を活用する一例を表しています。

func recommendDrink(isColdDay: Bool, prefersCoffee: Bool) {
    if isColdDay && prefersCoffee {
        print("寒い日にはコーヒーがオススメです。")
    } else if isColdDay {
        print("寒い日にはホットチョコレートがオススメです。")
    } else if prefersCoffee {
        print("コーヒーをお楽しみください。")
    } else {
        print("アイスティーをお楽しみください。")
    }
}

// 例1: 寒い日でコーヒーが好きな場合
recommendDrink(isColdDay: true, prefersCoffee: true)

// 例2: 暖かい日でコーヒーが好きな場合
recommendDrink(isColdDay: false, prefersCoffee: true)

このコードでは、recommendDrinkという関数を定義しています。

この関数はisColdDayprefersCoffeeという2つの真偽値を引数として受け取り、その組み合わせに応じておすすめのドリンクを提案します。

例1を実行すると、「寒い日にはコーヒーがオススメです。」と表示されます。

一方、例2を実行すると、「コーヒーをお楽しみください。」と表示されます。

これにより、関数の引数として論理演算子を利用することで、異なる条件や状況に応じた処理を柔軟に記述することができます。

○サンプルコード8:複数の条件を組み合わせた応用例

Swiftの論理演算子を使うと、複数の条件を組み合わせて一つの複雑な条件を作成することができます。

下記のサンプルコードは、年齢と学生であるかどうかの2つの条件を組み合わせて、映画のチケット価格を計算する関数を表しています。

func movieTicketPrice(age: Int, isStudent: Bool) -> Int {
    if age <= 15 || (isStudent && age < 25) {
        return 1000
    } else if age >= 65 {
        return 1200
    } else {
        return 1800
    }
}

// 例: 20歳の学生の場合
let price = movieTicketPrice(age: 20, isStudent: true)
print("映画のチケット価格は\(price)円です。")

この例では、15歳以下、または25歳未満の学生である場合は1000円、65歳以上は1200円、それ以外は1800円として、映画のチケット価格を計算しています。

上記のコードを実行すると、「映画のチケット価格は1000円です。」と表示されます。

このように、論理演算子を用いることで、複雑な条件判定を効率的に実現できます。

○サンプルコード9:配列やコレクションのフィルタリング

Swiftにおける配列やコレクションのフィルタリングは、特定の条件に一致する要素を抽出する際に非常に役立ちます。

ここでは、Swiftの論理演算子を活用して、配列の中から特定の条件に合致する要素のみを抽出する方法を詳しく説明します。

下記のサンプルコードは、整数の配列から偶数のみを抽出する例を表しています。

let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let evenNumbers = numbers.filter { $0 % 2 == 0 }
print(evenNumbers) // [2, 4, 6, 8, 10]

このコードでは、filterメソッドを使用して配列numbersの中から偶数のみを抽出しています。

フィルタリングの条件はクロージャ内で指定され、$0 % 2 == 0という論理式によって偶数を判定しています。

実際に上記のコードを実行すると、[2, 4, 6, 8, 10]という偶数だけが含まれる新しい配列が得られます。

さらに応用的な例として、次のサンプルコードは、文字列の配列から指定された文字数以上の文字列のみを抽出する関数を表しています。

func filterStringsByLength(strings: [String], minLength: Int) -> [String] {
    return strings.filter { $0.count >= minLength }
}

let fruits = ["apple", "banana", "kiwi", "grape"]
let result = filterStringsByLength(strings: fruits, minLength: 5)
print(result) // ["apple", "banana"]

この例では、filterStringsByLength関数を定義しており、この関数は文字列の配列と最小の文字数を引数として受け取ります。

そして、filterメソッドを使って、指定された文字数以上の文字列のみを返すようになっています。

関数を実行すると、「apple」と「banana」の2つの文字列が返されることが確認できます。

Swiftの配列やコレクションのフィルタリング機能は、データを選別する際に非常に役立ちます。

特に大量のデータを扱う場合や、特定の条件を満たすデータを抽出する際に、論理演算子と組み合わせて利用することで、効率的なプログラムを実現することができます。

○サンプルコード10:オプショナルとの組み合わせ

Swiftのオプショナルは、値が存在する場合と存在しない場合の2つの状態を持つことができる特別な型です。

このオプショナルを論理演算子と組み合わせることで、さまざまな条件下での処理を柔軟に記述することができます。

例として、オプショナルの整数を引数として受け取り、その値が偶数であればtrue、奇数であればfalse、値が存在しなければnilを返す関数を考えてみましょう。

func isEven(number: Int?) -> Bool? {
    guard let unwrappedNumber = number else {
        return nil
    }
    return unwrappedNumber % 2 == 0
}

let evenNumber: Int? = 4
let

 oddNumber: Int? = 5
let noNumber: Int? = nil

print(isEven(number: evenNumber)) // true
print(isEven(number: oddNumber)) // false
print(isEven(number: noNumber)) // nil

このコードでは、isEven関数を定義しています。

この関数はオプショナルの整数を引数として受け取り、その値が偶数であればtrue、奇数であればfalseを返します。

もし引数としてnilが渡された場合は、nilを返すようにしています。

関数を実行すると、それぞれのケースにおいて期待される結果が返されることが確認できます。

●論理演算子の注意点と対処法

Swiftでの論理演算子の利用は、条件判定やフロー制御において非常に強力なツールです。

しかし、正しく使わないと期待する動作をしない、あるいはバグの原因となる可能性があります。

ここでは、論理演算子を使用する際の一般的な注意点と、それに対する対処法を詳しく解説します。

○短絡評価の理解

Swiftの&&(AND)および||(OR)演算子は、短絡評価を行います。

これは、&&に関しては、最初の式がfalseの場合、次の式は評価されないことを意味します。

同様に、||においては、最初の式がtrueの場合、次の式は評価されません。

var a = 1
let condition = false && (a == 2)

この例では、false && ...という部分で、...は評価されません。したがって、a == 2は評価されず、aの値が変更されても結果に影響しません。

○結合の順番

複数の論理演算子を組み合わせて使用する際、演算子の結合の順番を明確に理解しておくことが重要です。

&&||よりも結合の優先度が高いため、混在する場合は括弧を使用して明確にすることを推奨します。

let result = (a && b) || c

この例では、a && bが先に評価され、その結果とc||演算子で評価されます。

○演算子の過度な使用

複雑な条件式を作成する際、論理演算子を過度に使用すると、コードの可読性が低下する恐れがあります。

複雑な条件は、複数の小さな部分に分けて表現するか、適切な変数名や関数を使用して、意図を明確にすることが望ましいです。

○真偽の混乱

Swiftでは、0nilは自動的にfalseとして扱われません。

そのため、真偽の評価には、明示的な条件式を記述する必要があります。

let number: Int? = nil
if number != nil && number! > 5 {
    print("Number is greater than 5")
}

この例では、numbernilでない場合、number! > 5という条件が評価されます。

numbernilの場合、条件の評価は短絡されます。

●論理演算子のカスタマイズ方法

Swiftは柔軟性が高いプログラミング言語であり、標準の演算子をカスタマイズしたり、新しい演算子を定義したりすることが可能です。

論理演算子も例外ではなく、特定の用途に合わせてカスタマイズすることができます。

ここでは、Swiftの論理演算子のカスタマイズ方法について詳しく解説します。

○演算子のオーバーロード

Swiftでは、既存の演算子をオーバーロードすることで、特定の型に対する動作をカスタマイズすることができます。

これにより、独自のデータ型に対して論理演算子を使用する際の振る舞いを定義することができます。

このコードでは、独自のVector型に対して&&演算子をオーバーロードしています。

この例では、2つのベクトルが両方とも原点から離れている場合にtrueを返します。

struct Vector {
    var x: Int
    var y: Int
}

func && (left: Vector, right: Vector) -> Bool {
    return (left.x != 0 || left.y != 0) && (right.x != 0 || right.y != 0)
}

let v1 = Vector(x: 1, y: 2)
let v2 = Vector(x: 0, y: 0)
let result = v1 && v2

上記のコードを使用すると、v1 && v2の評価結果はfalseとなります。

なぜなら、v2は原点に位置しているためです。

○新しい論理演算子の定義

Swiftはカスタム演算子の定義もサポートしています。

この機能を使用して、新しい論理演算子を定義することも可能です。

このコードでは、~~という新しい論理演算子を定義し、2つのInt値がともに偶数である場合にtrueを返すようにしています。

infix operator ~~

func ~~ (left: Int, right: Int) -> Bool {
    return left % 2 == 0 && right % 2 == 0
}

let a = 4
let b = 8
let isBothEven = a ~~ b

この場合、a ~~ btrueを返します。

なぜなら、abも偶数であるためです。

まとめ

Swiftの論理演算子は、プログラムの条件判定やデータの操作に不可欠なツールとして、頻繁に利用されます。

この記事では、初心者から上級者までのSwift開発者が論理演算子を効果的に使用するための基本的な情報から応用技術、カスタマイズ方法までを網羅的に紹介しました。

具体的には、基本的なAND、OR、NOT演算から始め、より複雑な論理演算の組み合わせや、条件分岐、ループ内での利用例、関数の引数としての使用方法など、多岐にわたる実用的なサンプルコードを提供しました。

また、配列やコレクションのフィルタリング、オプショナルとの組み合わせ方、論理演算子の注意点や対処法、さらには演算子のカスタマイズ方法についても詳しく解説しました。

Swift開発において、論理演算子は非常に汎用性が高く、多くの場面で活躍します。

しかし、その強力さゆえに誤用や過度なカスタマイズが行われることもあり、その結果としてコードの可読性や保守性が低下するリスクも伴います。

したがって、正確な知識と適切な使用方法を身につけることが、高品質なSwiftコードを書く上での鍵となります。

この記事がSwiftの論理演算子を効果的に利用するための参考資料として、皆様のSwiftプログラミングのスキルアップに貢献できれば幸いです。