Swift: Swiftの演算子:算術・比較・論理演算子の初心者向けガイド

演算子はコードの中の計算記号です。このレッスンではSwiftのすべての基本演算子と、それらを効果的に使う方法を学びます。

1. 学習目標


2. 実話:金融アナリストのケース

(1) 課題:Int除算が小数を切り捨ててレポートが破綻

Bobはスタートアップの金融アナリストで、四半期ごとの収益成長率を計算する必��がありました。彼は次のコードを書きました:

SWIFT
let currentRevenue = 250_000
let previousRevenue = 200_000
let growthRate = (currentRevenue - previousRevenue) / previousRevenue * 100
print("Growth rate: \(growthRate)%")

出力:

TEXT 📖 参照専用
Growth rate: 0%

Bobは実際の成長率が25%であることを知っていましたが、コードの出力は0%でした。理由:Int除算は小数を切り捨てます——50,000 / 200,000は整数演算では0となり、100を掛けても0のままです。

(2) 解決策:正確な計算にDoubleを使用

データをDoubleに切り替えることで、除算時に小数が保持されます:

SWIFT
let currentRevenue = 250_000.0
let previousRevenue = 200_000.0
let growthRate = (currentRevenue - previousRevenue) / previousRevenue * 100
print("Growth rate: \(growthRate)%")

出力:

TEXT 📖 参照専用
Growth rate: 25.0%

問題は即座に解決しました。Bobはその後12ヶ月分のレポートを監査し、Int除算による精度損失の事例をさらに4件発見しました。

(3) 結果:適切な演算子使用後のレポート精度

観点 Before After
数値エラー 月3〜5件 0
レポートレビュー時間 毎回2時間 15分
チームの信頼 「レポートが間違っているかも」 「データは信頼できる」
演算子の理解度 Int除算の挙動が不明確 適切な型を自ら選択

3. 算術演算子と代入演算子

算術演算子は数学的計算を実行し、代入演算子は変数に値を保存します。これらはSwiftで最も頻繁に使用される演算子です。

100%
graph LR
    A[演算子] --> B["算術: + - * / %"]
    A --> C["代入: = += -= *= /="]
    B --> D[数値計算]
    C --> E[変数の値を更新]
演算子 名称 結果
+ 加算 10 + 3 13
- 減算 10 - 3 7
* 乗算 10 * 3 30
/ 除算 10 / 3 3(Intは切り捨て)
% 剰余 10 % 3 1

(1) 算術演算子

SWIFT
let a = 15
let b = 4
let sum = a + b      // 19
let diff = a - b     // 11
let prod = a * b     // 60
let quot = a / b     // 3 (Int division truncates decimals)
let rem = a % b      // 3 (15 / 4 = 3 remainder 3)
⚠️ 注意: Int除算は小数部分を直接切り捨て、四捨五入は行いません。15 / 4は3.75ではなく3になります。小数の結果が必要な場合はDoubleを使用してください。

(2) 複合代入演算子

複合代入演算子は、算術と代入をより簡潔な形で組み合わせます:

SWIFT
var score = 10
score += 5     // Equivalent to score = score + 5 -> 15
score -= 3     // Equivalent to score = score - 3 -> 12
score *= 2     // Equivalent to score = score * 2 -> 24
score /= 4     // Equivalent to score = score / 4 -> 6
複合演算子 意味 同等の式
+= 加算して代入 x += 5 x = x + 5
-= 減算して代入 x -= 3 x = x - 3
*= 乗算して代入 x *= 2 x = x * 2
/= 除算して代入 x /= 4 x = x / 4

▶ サンプル: 月次支出トラッカー

SWIFT
// ============================================
// Track monthly expense totals
// Demonstrates arithmetic and compound assignment operators
// ============================================
var monthlyExpenses = 0.0
let rent = 1200.00
let groceries = 450.50
let transportation = 85.00
let entertainment = 200.00
monthlyExpenses += rent
monthlyExpenses += groceries
monthlyExpenses += transportation
monthlyExpenses += entertainment
let annualExpenses = monthlyExpenses * 12
let weeklyAverage = monthlyExpenses / 4.33
print("Monthly total: $\(monthlyExpenses)")
print("Annual total: $\(annualExpenses)")
print("Weekly average: $\(String(format: "%.2f", weeklyAverage))")

出力:

TEXT 📖 参照専用
Monthly total: $1935.5
Annual total: $23226.0
Weekly average: $447.23

4. 比較演算子と論理演算子

比較演算子は2つの値を比較してBoolの結果を返し、論理演算子は複数のブール条件を組み合わせます。

100%
graph TB
    A[比較演算子] --> B["== 等しい"]
    A --> C["!= 等しくない"]
    A --> D["> より大きい"]
    A --> E["< より小さい"]
    A --> F[">= 以上"]
    A --> G["<= 以下"]
    B --> H[Boolを返す]
    C --> H
    D --> H
演算子 名称 結果
== 等しい 5 == 5 true
!= 等しくない 5 != 3 true
> より大きい 5 > 3 true
< より小さい 5 < 3 false
>= 以上 5 >= 5 true
<= 以下 5 <= 3 false

(1) 比較演算子

SWIFT
let age = 18
let isAdult = age >= 18     // true
let canDrive = age >= 16    // true
let isSenior = age > 65     // false
let userName = "Alice"
let isAdmin = userName == "Admin"  // false

(2) 論理演算子

演算子 名称 意味
&& AND 両方の条件がtrueである必要がある age >= 18 && hasLicense
` ` OR
! NOT 値を否定する !isLoggedIn
SWIFT
let hasTicket = true
let isVip = false
let canEnter = hasTicket && isVip   // false
let canAccess = hasTicket || isVip  // true
let isNotVip = !isVip               // true

▶ サンプル: ユーザー権限チェック

SWIFT
// ============================================
// Check if a user has access to the admin panel
// Demonstrates comparison and logical operators
// ============================================
let userAge = 22
let hasVerifiedEmail = true
let isBanned = false
let isAdmin = false
let isAdult = userAge >= 18
let canAccessSystem = isAdult && hasVerifiedEmail && !isBanned
let hasAdminAccess = isAdmin
let finalAccess = canAccessSystem || hasAdminAccess
print("Adult: \(isAdult)")
print("Email verified: \(hasVerifiedEmail)")
print("Not banned: \(!isBanned)")
print("Final access: \(finalAccess)")

出力:

TEXT 📖 参照専用
Adult: true
Email verified: true
Not banned: true
Final access: true

5. 三項演算子と型変換

三項演算子はif-elseの簡潔な代替手段であり、数値型変換により異なる型が連携できるようになります。

(1) 三項条件演算子

構文: 条件 ? 値A : 値B — 条件がtrueの場合は値Aを返し、そうでない場合は値Bを返します:

SWIFT
let score = 85
let grade = score >= 60 ? "Pass" : "Fail"
print(grade)  // Pass
スタイル コード行数 可読性
if-else版 5行 明確だが冗長
三項版 1行 簡潔、単純な条件に最適
SWIFT
var result: String
if score >= 60 {
    result = "Pass"
} else {
    result = "Fail"
}
let result2 = score >= 60 ? "Pass" : "Fail"
⚠️ 注意: 三項演算子は単純な二者択一に最適です。条件が複雑になる場合はif-elseを使用してください。

(2) 数値型変換

IntとDoubleの間では明示的な変換が必要です:

SWIFT
let x = 10       // Int
let y = 3.5      // Double
let result1 = Double(x) + y  // 13.5
let result2 = x + Int(y)     // 13 (y truncated to 3)
変換 構文 結果
IntをDoubleに Double(intVal) 整数部を保持、.0を追加
DoubleをIntに Int(doubleVal) 小数を切り捨て、丸めなし
IntをStringに String(intVal) テキストに変換

▶ サンプル: 割引計算機

SWIFT
// ============================================
// Calculate discount based on purchase amount
// Demonstrates the ternary operator and type conversion
// ============================================
let purchaseAmount = 120.0
let itemCount = 3
let discountRate: Double = purchaseAmount >= 100 ? 0.9 : 1.0
let finalAmount = purchaseAmount * discountRate
let averagePrice = finalAmount / Double(itemCount)
print("Purchase amount: $\(purchaseAmount)")
print("Discount: \(Int((1 - discountRate) * 100))%")
print("Final amount: $\(finalAmount)")
print("Item count: \(itemCount)")
print("Average price per item: $\(String(format: "%.2f", averagePrice))")
let freeShipping = finalAmount >= 100 ? "Free Shipping" : "Shipping Fee"
print("Shipping: \(freeShipping)")

出力:

TEXT 📖 参照専用
Purchase amount: $120.0
Discount: 10%
Final amount: $108.0
Item count: 3
Average price per item: $36.00
Shipping: Free Shipping

6. 完全な例:月次予算分析ツール

SWIFT
// ============================================
// Monthly budget analysis tool
// Demonstrates arithmetic, comparison, logical, and ternary operators
// ============================================
import Foundation
// 1. Income and expense data
let salary = 5200.0
let rent = 1400.0
let food = 600.0
let transport = 120.0
let utilities = 200.0
let entertainment = 300.0
// 2. Calculate using arithmetic and compound assignment
var totalExpenses = 0.0
totalExpenses += rent
totalExpenses += food
totalExpenses += transport
totalExpenses += utilities
totalExpenses += entertainment
let savings = salary - totalExpenses
let savingsRate = savings / salary * 100
// 3. Use comparison and ternary to assess financial health
let isHealthy = savingsRate >= 20
let advice = isHealthy ? "Healthy" : "Needs Improvement"
// 4. Logical check: any single category over budget?
let rentTooHigh = rent > salary * 0.3
let foodTooHigh = food > salary * 0.15
let needsAdjustment = rentTooHigh || foodTooHigh
print("=== Monthly Budget ===")
print("Income: $\(salary)")
print("Expenses: $\(totalExpenses)")
print("Savings: $\(String(format: "%.2f", savings))")
print("Savings Rate: \(Int(savingsRate))%")
print("Status: \(advice)")
print("Needs Adjustment: \(needsAdjustment)")
// 5. Type conversion example
let categoryCount = 5
let avgPerCategory = totalExpenses / Double(categoryCount)
print("Categories: \(categoryCount), Avg: $\(String(format: "%.2f", avgPerCategory))")

出力:

TEXT 📖 参照専用
=== Monthly Budget ===
Income: $5200.0
Expenses: $2620.0
Savings: $2580.0
Savings Rate: 49%
Status: Healthy
Needs Adjustment: false
Categories: 5, Avg: $524.00

❓ よくある質問

Q Int除算で小数の結果を得るにはどうすればいいですか?
A 少なくとも一方のオペランドをDoubleに変換します。例:Double(10) / 3は3.3333になります。または最初��ら10.0 / 3と宣言します。
Q %演算子はDoubleにも使えますか?
A いいえ。Swiftの%は整数にのみ使用できます。浮動小数点の剰余にはtruncatingRemainder(dividingBy:)メソッドを使用します。
Q &&と||は短絡評価されますか?
A はい。&&は左辺がfalseの場合に右辺を評価せず、||は左辺がtrueの場合に右辺を評価しません。これを賢く使って効率を向上させましょう。
Q 複合代入演算子は値を返しますか?
A いいえ。x += 5は文であり、式ではないため、代入や比較に使用できません。これはC言語とは異なります。

📖 まとめ


📝 練習問題

  1. 初級: 算術演算子を使って、長さ12.5、幅8.3の長方形の面積と周囲長を計算し、結果を出力してください。
  2. 中級: 閏年かどうかを判定するプログラムを書いてください。ルール:4で割り切れるが100で割り切れない、または400で割り切れる。論理演算子を使って条件を組み合わせ��ください。
  3. 上級: 電気料金計算機を作成してください。基本料金は$0.12/kWh。月間使用量が300kWhを超えた場合、超過分は$0.15/kWhで計算します。三項演算子と算術演算子を使って総料金を計算してください。
Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%