Swift学习笔记-运算符重载

参考书籍:
[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

 

分享到:更多 ()