类和结构体可以为现有的运算符提供自定义的实现。这通常被称为运算符重载。
下面的例子展示了如何让自定义的结构体支持加法运算符(+
)。算术加法运算符是一个二元运算符,因为它是对两个值进行运算,同时它还可以称为中缀运算符,因为它出现在两个值中间。
例子中定义了一个名为 Vector2D
的结构体用来表示二维坐标向量 (x, y)
,紧接着定义了一个可以将两个 Vector2D
结构体实例进行相加的运算符函数:
struct Vector2D {
var x = 0.0, y = 0.0
}
extension Vector2D {
static func + (left: Vector2D, right: Vector2D) -> Vector2D {
return Vector2D(x: left.x + right.x, y: left.y + right.y)
}
}
该运算符函数被定义为 Vector2D
上的一个类方法,并且函数的名字与它要进行重载的 +
名字一致。因为加法运算并不是一个向量必需的功能,所以这个类方法被定义在 Vector2D
的一个扩展中,而不是 Vector2D
结构体声明内。而算术加法运算符是二元运算符,所以这个运算符函数接收两个类型为 Vector2D
的参数,同时有一个 Vector2D
类型的返回值。
在这个实现中,输入参数分别被命名为 left
和 right
,代表在 +
运算符左边和右边的两个 Vector2D
实例。函数返回了一个新的 Vector2D
实例,这个实例的 x
和 y
分别等于作为参数的两个实例的 x
和 y
的值之和。
这个类方法可以在任意两个 Vector2D
实例中间作为中缀运算符来使用:
let vector = Vector2D(x: 3.0, y: 1.0)
let anotherVector = Vector2D(x: 2.0, y: 4.0)
let combinedVector = vector + anotherVector
// combinedVector 是一个新的 Vector2D 实例,值为 (5.0, 5.0)
这个例子实现两个向量 (3.0,1.0)
和 (2.0,4.0)
的相加,并得到新的向量 (5.0,5.0)
。这个过程如下图示:
评论列表(0条)