类和结构体可以位现有的运算符提供自定义的实现。成为运算符重载
code
//: A UIKit based Playground for presenting user interface
import UIKit
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)
}
}
let vector = Vector2D(x:3.0,y: 1.0)
let anotherVector = Vector2D(x:2.0,y:4.0)
let combindVector = vector + anotherVector
print(combindVector.x)
print(combindVector.y)
结果都是5
一元运算符重载
类与结构体也能提供标准一元运算符的实现
要实现前缀或后缀运算符,需要在声明运算符函数的时候在func关键字之前指定prefix或postfix限定符
code
//: A UIKit based Playground for presenting user interface
import UIKit
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)
}
static prefix func - (vector:Vector2D)-> Vector2D{
return Vector2D(x:-vector.x,y:-vector.y)
}
}
let vector = Vector2D(x:3.0,y: 1.0)
let anotherVector = Vector2D(x:2.0,y:4.0)
let combindVector = vector + anotherVector
let negatice = -vector
print(negatice.x)
print(negatice.y)
结果 -3 -1
组合赋值运算符重载
组合复制运算符将赋值运算符(=)与其他运算符进行结合
在实现的时候,需要把运算符的左参数设置成inout类型,因为这个参数的值会在运算符函数内直接被修改
code
//: A UIKit based Playground for presenting user interface
import UIKit
struct Vector2D{
var x = 0.0, y = 0.0
}
extension Vector2D{
static func += (left: inout Vector2D,right:Vector2D) {
left = Vector2D(x:left.x+right.x,y: left.y+right.y)
}
}
var vector = Vector2D(x:3.0,y: 1.0)
let anotherVector = Vector2D(x:2.0,y:4.0)
vector += anotherVector
print(vector.x)
print(vector.y)
结果都是5.0
等价运算符重载
自定义类和结构体不接受等价运算符的默认实现。也就是所谓的『等于』运算符(==)
要使用等价运算符来检查好你自己类型的等价,需要和其他中缀运算符一样提哦那个一个『等于』运算符重载,并且遵循标准库的Equatable协议
code
//: A UIKit based Playground for presenting user interface
import UIKit
struct Vector2D{
var x = 0.0, y = 0.0
}
extension Vector2D{
static func == (left:Vector2D,right:Vector2D)->Bool{
return (left.x==right.x)&&(left.y==right.y)
}
}
var vector = Vector2D(x:3.0,y: 1.0)
let anotherVector = Vector2D(x:2.0,y:4.0)
print(vector==anotherVector)
结果false
Swift' 为一下自定义类型提供等价运算符合成实现
只拥有遵循Equatable 协议存储的结构体
只拥有Equatable协议关联类型的枚举
没有关联类型的枚举
code
//: A UIKit based Playground for presenting user interface
import UIKit
struct Vector3D:Equatable{
var x = 0.0, y = 0.0,z=0.0
}
let twoThreeFor = Vector3D(x:2.0,y: 3.0,z:4.0)
let antherTwoThreeFour = Vector3D(x: 2.0, y: 3.0, z: 4.0)
print(twoThreeFor == antherTwoThreeFour)
结果
true