运算符重载与优先级组
为您的类型重载内置运算符,并定义 优先级组 ,使表达式按预期解析。保持设计简洁且可预测。
运算符重载与优先级组 是 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 反馈 — 无需本地设置。