- 对于自定义的结构体等,需要我们进行运算符的重载,来对自定义的结构体等进行数据处理。
中置运算符
- 对于结构体,没有加号运算符,下面就以结构体为例,自定义加号运算符。
struct Ponit{
var x = 0.0
var y = 0.0
}
// 中置运算符重载
func + (left:Ponit,right:Ponit) -> Ponit{
return Ponit(x: left.x + right.x, y: left.y + right.y)
}
let point1 = Ponit(x: 3.0, y: 4.0)
let point2 = Ponit(x: 3.0, y: 5.0)
let point3 = point1 + point2
print("\(point3)")
前置和后置运算符
Swift3.0
之后已经废弃了自增、自减运算符。
前置
- 前置需要使用关键字
prefix
prefix func ++ (oldValue: Int) -> Int{
return oldValue + 1
}
var old = 2
var new = ++old
后置
- 前置需要使用关键字
postfix
postfix func ++ (oldValue: Int) -> Int{
return oldValue + 1
}
var new1 = old++
print("\(old)")
- 通过打印可以发现,并没有修改原本的数据,而是新生成了一个数据。
组合运算符
- 组合赋值是其他运算符和赋值运算符一起执行的运算。
- 被关键字
inout
修饰的参数,会在运算符函数内直接修改其值。
func += (left:inout Ponit,right:Ponit) {
left = left + right
// 加号方法在前面已经实现
}
var point4 = Ponit(x: 40, y: 50)
var point5 = Ponit(x: 20, y: 10)
point4 += point5
print(point4)
// point4 的值发生了改变
注意:
- 对于默认的运算符是不可以进行重载的,会造成死循环。
func + (left:Int,right:Int) -> Int{
print("---")
return left+right
}
var ss = 4+5
// 通过打印,可以发现不停的进行输出
- 只有组合运算符可以被重载。
- 三目运算符也不可以进行重载。
比较运算符
- 自定义的类型不仅仅没有加、减运算符,同时也没有比较运算符,这都需要自己定义。
- 代码示例,点是否重合:
func == (left:Ponit,right:Ponit) -> Bool{
return (left.x == right.x) && (left.y == left.y)
}
if point4 == point5 {
print("两点重合")
}else{
print("两点不重合")
}
自定义运算符
- 系统提供的运算符不够用,需要自己进行定义,即使自己定义的运算符,只能使用
/ * - = + % < > & | ~ ! ~
这些字符。 - 新的运算符需要在全局域使用
operator
关键字声明,可以将其声明为前置、中置或者后置。 - 自定义的运算符需要指定
prefix / infix / postfix
限定符,限定该运算符的位置。 infix
中置运算符还可以指定优先级(precedence
)和结合性(associativity
)。
prefix operator
自定义中置运算符的优先级和结合性
- 结合性(
associativity
)的可取值有lfet
、right
和none
。 - 结合性的默认值
none
,优先级(precedence
)默认为100
,范围0~255
。