参考书籍:
[1]管蕾.张玲玲.朱元波.Swift开发实战[M]. 北京:人民邮电出版社.2014.10-1 ISBN 978-7-115-36827-0
[2]陈隽.刘媛媛.Swift入门很简单[M]. 北京:清华大学出版社.2015.01-01 ISBN 978-7-302-38880-7
运算符重载其实是一种特殊的函数。特让已有的运算符也可以对自定义的类和结构进行运算。
一、算术运算符重载
算数运算符分为+、-、*、/ 四种,其都属于中置运算符,重载语法形式:
func 算术运算符 (参数:数据类型,...,参数:数据类型)->返回值类型{ ... return 返回数据 }
例如自定义"+"加法运算符重载。
import Foundation struct Vector2D{ var x = 0.0 var y = 0.0 } 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 anvector = Vector2D(x: 7.0 , y:8.9) let comvector = vector + anvector; print(comvector.x) print(comvector.y)
终端如下:
10.0
9.9
Program ended with exit code: 0
二、一元减/加运算符重载
操作数前加一个"-"好,此符号被叫做一元减操作符,作用是将正数变成负数,负数变正数。一元加操作符无实际作用。
1、一元减操作符重载
prefix func - (参数:数据类型) -> 数据类型{ return 返回数据 }
例如,一元减运算符重载:
import Foundation struct Vector2D{ var x = 0.0 var y = 0.0 } prefix func - (vector: Vector2D) -> Vector2D { return Vector2D(x: -vector.x , y: -vector.y) } let vector = Vector2D(x: 3.0 , y: 1.0) let comvector = -vector; print(comvector.x) print(comvector.y)
终端:
-3.0
-1.0
Program ended with exit code: 0
三、复合赋值运算符重载
语法形式:
fun 复合运算符 (inout 参数名:数据类型,参数名:数据类型){ ... }
注意:
1、需要将运算符左参数设置成inout,这个参数会在运算符重载函数内直接修改其值。
2、运算符inout不可缺少
3、需要定义相关运算符重载,如定义"+=",还需定义"+"假发运算符。
例如:
import Foundation struct Vector2D{ var x = 0.0 var y = 0.0 } func + (left: Vector2D, right: Vector2D) -> Vector2D { return Vector2D(x: left.x + right.x , y: left.y + right.y) } func += (inout left: Vector2D ,right: Vector2D){ left = left + right } let vector = Vector2D(x: 3.0 , y: 1.0) var comvector = Vector2D(x: 7.0 , y:8.9) comvector += vector print(comvector.x) print(comvector.y)
终端如下:
10.0
9.9
Program ended with exit code: 0
四、自增自减运算符重载
自增自减运算符都分为前缀运算符和后缀运算符重载。
1、前缀自增运算符重载
语法形式:
prefix func ++ (inout 参数:数据类型) -> 返回值类型{ ... return 返回数据 }
注意:prefix 表示此运算符重载是前缀的,参数名前需要设置inout
import Foundation struct Vector2D{ var x = 0.0 var y = 0.0 } func + (left: Vector2D, right: Vector2D) -> Vector2D { return Vector2D(x: left.x + right.x , y: left.y + right.y) } func += (inout left: Vector2D ,right: Vector2D){ left = left + right } prefix func ++ (inout vector: Vector2D)-> Vector2D { vector += Vector2D(x: 1.0, y: 1.0) return vector } //let vector = Vector2D(x: 3.0 , y: 1.0) var comvector = Vector2D(x: 7.0 , y:8.9) ++comvector print(comvector.x) print(comvector.y)
终端:
8.0
9.9
Program ended with exit code: 0
2、后缀自增运算符重载
语法形式:
postfix func ++ (inout 参数:数据类型) -> 返回值类型 { ... return 数据 }
import Foundation struct Vector2D{ var x = 0.0 var y = 0.0 } func + (left: Vector2D, right: Vector2D) -> Vector2D { return Vector2D(x: left.x + right.x , y: left.y + right.y) } func += (inout left: Vector2D ,right: Vector2D){ left = left + right } postfix func ++ (inout vector: Vector2D)-> Vector2D { vector += Vector2D(x: 1.0, y: 1.0) return vector } //let vector = Vector2D(x: 3.0 , y: 1.0) var comvector = Vector2D(x: 7.0 , y:8.9) comvector++ print(comvector.x) print(comvector.y)
终端:
8.0
9.9
Program ended with exit code: 0
五、比较运算符重载
1、"=="相等运算符重载
语法形式:
func == (参数:数据类型,参数:数据类型) -> Bool { return 返回类型 }
六、自定义运算符重载
自定义运算符分为前置、中置、后置三种
1、前置自定义运算符
定义形式:
prefix operator 自定义运算符 (...)
重载形式:
prefix func 自定义运算符 ( inout 参数:数据类型) ->数据类型 { ... return 返回数据 }
例如:自定义一个"***"运算符,实现结构属性平方
import Foundation struct Vector2D{ var x = 0.0 var y = 0.0 } prefix operator *** {} func * (left: Vector2D, right: Vector2D) -> Vector2D { return Vector2D(x: left.x * right.x , y: left.y * right.y) } func *= (inout left: Vector2D ,right: Vector2D){ left = left * right } prefix func *** (inout vector: Vector2D)-> Vector2D { vector *= vector return vector } //let vector = Vector2D(x: 3.0 , y: 1.0) var comvector = Vector2D(x: 2.0 , y:2.0) ***comvector print(comvector.x) print(comvector.y)
终端如下:
4.0
4.0
Program ended with exit code: 0
2、中置自定义运算符
定义形式:
infix operator 自定义运算符 (...)
重载形式:
func 自定义运算符 ( inout 参数:数据类型) ->数据类型 { ... return 返回数据 }
3、后置自定义运算符
定义形式:
postfix operator 自定义运算符 (...)
重载形式:
postfix func 自定义运算符 ( inout 参数:数据类型) ->数据类型 { ... return 返回数据 }
4、自定义运算符优先级和结合性
4.1优先级
运算符优先级可以让一些运算符优先于其它运算符执行,高优先级运算符会先执行。自定义优先级语法形式如下:
infix operator 自定义运算符 {precedence 优先级值} //precedence 在0~255范围内,越大优先级越高。默认值为100
注意:优先级只能定义在中置运算符中,且两种自定义优先级不可以相同。
4.2结合性
结合性定义相同优先级运算符一起时怎么组合或关联,语法形式:
infix operator 自定义运算符 {associativity 结合性值}
结合性值有left、right、none