0Pricing
Swift Academy · 课时

运算符重载与优先级组

为您的类型重载内置运算符,并定义 优先级组 ,使表达式按预期解析。保持设计简洁且可预测。

运算符重载与优先级组 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 1 节课,共 3 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 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)

自定义运算符与优先级

声明一个优先级组并将其关联到运算符。右结合性会使 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

最佳实践

指南:

  • 对于非标准操作,优先使用方法;运算符应保留给常见的数学运算或位运算。
  • 符合用户预期(+ 表示加法,* 表示乘法)。
  • 记录自定义运算符,并保持运算符集合较小。
  • 定义优先级和结合性,避免产生有歧义的解析结果。

正确声明运算符

快速检查:添加带优先级组的新运算符时,哪种方式是正确的?

回顾

回顾:仅当运算符的语义明确时才重载它们;定义优先级组和结合性来控制解析;测试表达式以确保清晰易懂。

常见问题解答

「运算符重载与优先级组」课时是免费的吗?

是的 — 「运算符重载与优先级组」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 3 节课。

「运算符重载与优先级组」这节课中我会学到什么?

为您的类型重载内置运算符,并定义 优先级组 ,使表达式按预期解析。保持设计简洁且可预测。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Swift Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 3 节。

「运算符重载与优先级组」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Swift Academy 课中编写并运行代码吗?

能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 运算符重载与优先级组
  2. 下标与自定义索引再探
  3. Hashable/Equatable/Comparable 派生
← 返回 Swift Academy