0Pricing
Swift Academy · レッスン

演算子オーバーロードと優先順位グループ

自分の型に組み込み演算子をオーバーロードし、式が意図どおりに解析されるよう 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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 演算子オーバーロードと優先順位グループ
  2. サブスクリプトとカスタムインデックス再入門
  3. Hashable/Equatable/Comparableの自動導出
← Swift Academyに戻る