演算子オーバーロードと優先順位グループ
自分の型に組み込み演算子をオーバーロードし、式が意図どおりに解析されるよう precedence groups を定義します。設計は最小限で予測可能に保ちます。
「演算子オーバーロードと優先順位グループ」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン1/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全3レッスンが含まれています。
演算子をカスタマイズする理由
Swiftでは、自分の型に対して演算子をオーバーロードしたり、新しい演算子を作成したりできます。意図的に控えめに使い、明確さを優先して動作を文書化し、予期しない結果を避けるために優先順位を定義します。
組み込み演算子のオーバーロード
既存の演算子をオーバーロードするには、同じ記号と自分の型を使ったフリー関数を記述します。意味が予測可能になるようにします(例: +は値を加算します)。
struct Vector2D: CustomStringConvertible, Equatable {
var x: Double
var y: Double
var description: String { "(\(x), \(y))" }
}
func + (lhs: Vector2D, rhs: Vector2D) -> Vector2D {
Vector2D(x: lhs.x + rhs.x, y: lhs.y + rhs.y)
}
func == (lhs: Vector2D, rhs: Vector2D) -> Bool {
lhs.x == rhs.x && lhs.y == rhs.y
}
let a = Vector2D(x: 1, y: 2)
let b = Vector2D(x: 3, y: 4)
let c = a + b
print(c) // (4.0, 6.0)カスタム演算子と優先順位
precedencegroupを宣言し、それを演算子に割り当てます。右結合にすると、2 ** 3 ** 2は2 ** (3 ** 2)として解析されます。
// Define power operator ** with right-associative precedence
precedencegroup PowerPrecedence {
higherThan: MultiplicationPrecedence
associativity: right
}
infix operator ** : PowerPrecedence
// Simple integer exponent (education-only; no overflow checks)
func ** (base: Int, exp: Int) -> Int {
guard exp >= 0 else { return 0 } // keep it simple for demo
if exp == 0 { return 1 }
var result = 1
for _ in 0..<exp { result *= base }
return result
}
print(2 ** 3) // 8
print(2 ** 3 ** 2) // 2 ** (3 ** 2) = 2 ** 9 = 512 (right-assoc)前置演算子/後置演算子
前置/後置演算子を定義できます。これらは意味が明確な数学に近い領域に限定し、意外な意味を持たせないようにしてください。
prefix operator √
prefix func √ (x: Double) -> Double { x.squareRoot() }
postfix operator !
postfix func ! (x: Bool) -> Bool { !x } // purely demo; avoid confusing overrides
print(√9) // 3.0
print(true!) // false (demo only — don't ship this)実際の優先順位
組み込みの優先順位(例: MultiplicationPrecedence)との関係を慎重に設定してください。式をテストして、読みやすさと意図どおりの動作を確認します。
// Demonstrate how precedence affects parsing
// Our PowerPrecedence is higher than Multiplication.
// So this parses as: 2 * (3 ** 2) = 18
let r1 = 2 * 3 ** 2
print(r1)
// Compare if we had lower precedence (hypothetical):
// Then it would parse as (2 * 3) ** 2 = 36ベストプラクティス
ガイドライン:
- 標準的でない操作にはメソッドを優先し、演算子は一般的な数学演算やビット演算に限定してください。
- 利用者の期待(+は加算、*は乗算)に合わせてください。
- カスタム演算子をドキュメント化し、数を少なく保ってください。
- 曖昧な解析を避けるため、優先順位と結合性を定義してください。
演算子を正しく宣言する
確認問題: 優先順位グループを指定して新しい演算子を追加する正しい方法はどれですか?
まとめ
まとめ: 意味が明確な場合にのみ演算子をオーバーロードし、解析を制御するために優先順位グループと結合性を定義します。式をテストして、わかりやすさを確認してください。
よくある質問
「演算子オーバーロードと優先順位グループ」レッスンは無料ですか?
はい。「演算子オーバーロードと優先順位グループ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全3レッスンが含まれています。
「演算子オーバーロードと優先順位グループ」で何を学びますか?
自分の型に組み込み演算子をオーバーロードし、式が意図どおりに解析されるよう precedence groups を定義します。設計は最小限で予測可能に保ちます。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Swift Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/3です。
「演算子オーバーロードと優先順位グループ」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSwift Academyレッスンでコードを書いて実行できますか?
はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 演算子オーバーロードと優先順位グループ
- サブスクリプトとカスタムインデックス再入門
- Hashable/Equatable/Comparableの自動導出