//***********************************
//
// 高级运算符
// &+ : 向上溢出
// &- : 向下溢出
// &/ : 除零溢出,0作为被除数时结果是0
// &% : 模零溢出,对0求余结果是0
//
//***********************************
var willOverflow = UInt8.max //等于255
willOverflow= willOverflow &+ 1 // 等于0
willOverflow= willOverflow &+ 1 // 等于2
var willUnderflow = UInt8.min // 等于0
willUnderflow= willUnderflow &- 1 // 等于255
let x = 1
let y = x&/ 0 // 等于0
let z = x&% 0 // 等于0
//***********************************
//
// 运算符函数/运算符重载
// 让已有的运算符对自定义类和结构体进行运算
// 1.中置运算符
// 2.前置和后置运算符
// 3.组合赋值运算符
// 4.比较运算符
// 5.自定义运算符
//
//***********************************
//*********************
// 1.中置运算符
//*********************
struct Vector2D {
var x = 0.0 , y= 0.0
}
func + (left: Vector2D,right: Vector2D) -> Vector2D {
return Vector2D(x:left.x + right.x,y: left.y + right.y)
}
let vector1 = Vector2D(x:1.0, y: 2.0)
let vector2 = Vector2D(x:3.0, y: 4.0)
let vector3 = vector1+ vector2 // {x 4.0, y 6.0}
//*********************
// 2.前置和后置运算符
// 前置:prefix
// 后置:postfix
//*********************
prefix func-(vector: Vector2D) -> Vector2D {
return Vector2D(x:-vector.x, y: -vector.y)
}
postfix func++(vector: Vector2D) -> Vector2D {
let x = vector.x+ 1
let y = vector.y+ 1
return Vector2D(x:x, y: y)
}
let positive = Vector2D(x:3.0, y: 4.0)
let negative = -positive //{x -3.0, y-4.0}
let plusplus = positive++ //{x 4.0, y 5.0}
//*********************
// 3.组合赋值运算符
// 如: +=
// 需要使用inout修饰形参
//*********************
func += (inoutleft: Vector2D, right: Vector2D) {
left =left + right
}
var original = Vector2D(x:1.0, y: 2.0)
let v1 = Vector2D(x:3.0, y: 4.0)
original += v1 //{x 4.0, y 6.0}
//*********************
//
// 4.比较运算符
//
//*********************
func == (left: Vector2D,right: Vector2D) -> Bool {
return (left.x== right.x) && (left.y == right.y)
}
func != (left: Vector2D,right: Vector2D) -> Bool {
return !( left == right ) //使用上面定义的运算符
}
//*********************
//
// 5.自定义运算符
// 需要先使用关键字operator在全局域声明
// 前置:prefix
// 后置:postfix
// 中置:infix
//
//*********************
prefix operator +++ {}
prefix func +++(inout vector: Vector2D)-> Vector2D {
vector += vector //使用上面定义的运算符
return vector
}
//******************************
//
// 自定义中置运算符的优先性和结合性
//
//******************************