Swift: Swiftの演算子:算術・比較・論理演算子の初心者向けガイド
演算子はコードの中の計算記号です。このレッスンではSwiftのすべての基本演算子と、それらを効果的に使う方法を学びます。
1. 学習目標
- 算術演算子:加算、減算、乗算、除算、剰余
- 代入演算子と複合代入
- 比較演算子とブール値の結果
- 論理演算子:AND、OR、NOT
- 三項演算子と数値型変換
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で最も頻繁に使用される演算子です。
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の結果を返し、論理演算子は複数のブール条件を組み合わせます。
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言語とは異なります。📖 まとめ
- 算術演算子:
+-*/%。Int除算は小数を切り捨てる。 - 複合代入:
+=-=*=/=で変数を簡潔に更新。 - 比較演算子:
==!=><>=<=。すべてBoolを返す。 - 論理演算子:
&&(AND)、||(OR)、!(NOT)。短絡評価をサポート。 - 三項演算子:
条件 ? 値A : 値Bで1行の二者択一。 - 数値型変換:
Double()またはInt()で型の互換性を確保。
📝 練習問題
- 初級: 算術演算子を使って、長さ12.5、幅8.3の長方形の面積と周囲長を計算し、結果を出力してください。
- 中級: 閏年かどうかを判定するプログラムを書いてください。ルール:4で割り切れるが100で割り切れない、または400で割り切れる。論理演算子を使って条件を組み合わせ��ください。
- 上級: 電気料金計算機を作成してください。基本料金は$0.12/kWh。月間使用量が300kWhを超えた場合、超過分は$0.15/kWhで計算します。三項演算子と算術演算子を使って総料金を計算してください。