iOS-Swift中运算符的重载

1.我们重载“+”、“-”、“*”、“+=”运算符。

注意: “=”是不可以进行重载的。

struct Vector3 {
    
    var x: Double = 0.0
    var y: Double = 0.0
    var z: Double = 0.0

}

// 重载加号(+)
func + (left: Vector3, right: Vector3) -> Vector3 {
    return Vector3(x: left.x + right.x, y: left.y + right.y, z: left.z + right.z)
}

// 重载减号(-)
func - (left: Vector3, right: Vector3) -> Vector3 {
    return Vector3(x: left.x - right.x, y: left.y - right.y, z: left.z - right.z)
}

// 重载乘号(*)
func *(left: Vector3, right: Vector3) -> Double {
    return left.x * right.x + left.y * right.y + left.z * right.z
}

// 重载负号(-),只有一个参数  由于不知道“-”是放在参数的左侧还是右侧,故需要添加关键字prefix,代表“-”是在参数的左侧
prefix func - (value: Vector3) -> Vector3 {
    return Vector3(x: -value.x, y: -value.y, z: -value.z)
}

// 重载 +=  由于是把该操作会使left值发生改变,故left需要用到关键字 inout;由于“+”方法在之前定义过,故在这个方法中可以直接使用“+”方法。
func += (left: inout Vector3, right: Vector3){
    left = left + right
}

var v1 = Vector3(x: 1, y: 1, z: 1)
let v2 = Vector3(x: 3, y: 4, z: 5)

print(v1 + v2)
print(v1 - v2)
print(v1 * v2)
print(-v1)
print(v1 += v2)
print(v1)
/**
 打印结果
 Vector3(x: 4.0, y: 5.0, z: 6.0)
 Vector3(x: -2.0, y: -3.0, z: -4.0)
 12.0
 Vector3(x: -1.0, y: -1.0, z: -1.0)
 ()
 Vector3(x: 4.0, y: 5.0, z: 6.0)
 */
  1. 重载比较运算符
func == (left: Vector3, right: Vector3) -> Bool {
    return left.x == right.x && left.y == right.y && left.z == right.z
}

func != (left: Vector3, right: Vector3) -> Bool {
    return !(left == right)
}

func > (left: Vector3, right: Vector3) -> Bool {
    
    if left.x != right.x {return left.x > right.x}
    if left.y != right.y {return left.y > right.y}
    if left.z != right.z {return left.z > right.z}
    
    return false
}

func >= (left: Vector3, right: Vector3) -> Bool {
    return left > right || left == right
}

func < (left: Vector3, right: Vector3) -> Bool {
    return !(left >= right)
}

var v1 = Vector3(x: 1, y: 1, z: 1)
let v2 = Vector3(x: 3, y: 4, z: 5)

print(v1 == v2)
print(v1 != v2)
print(v1 > v2)
print(v1 >= v2)
print(v1 < v2)
/** 打印结果
 false
 true
 false
 false
 true
 */

3 自定义运算符

(1)对向量定义一个“+++”运算符,类似Int中的“++”运算符

// 对于系统中没有的运算符,需要通过 operator 来定义操作符,prefix表示操作符应在参数的前面
prefix operator +++
prefix func +++ (vector: inout Vector3) -> Vector3 {
    let vec = vector
    vector += Vector3(x: 1.0, y: 1.0, z: 1.0)
    return vec
}
// postfix表示操作符应在参数的后面
postfix operator +++
postfix func +++ (vector: inout Vector3) -> Vector3 {
    vector += Vector3(x: 1.0, y: 1.0, z: 1.0)
    return vector
}

var vector1 = Vector3(x: 1, y: 2, z: 3)  // {x: 1, y: 2, z: 3}
print(vector1+++)
print(vector1)

var vector2 = Vector3(x: 1, y: 2, z: 3)  // {x: 1, y: 2, z: 3}
print(+++vector2)
print(vector2)
/** 打印结果
 Vector3(x: 2.0, y: 3.0, z: 4.0)
 Vector3(x: 2.0, y: 3.0, z: 4.0)
 Vector3(x: 1.0, y: 2.0, z: 3.0)
 Vector3(x: 2.0, y: 3.0, z: 4.0) */

(2) 自定义一个中间运算符 infix

struct Vector3 {
    
    var x: Double = 0.0
    var y: Double = 0.0
    var z: Double = 0.0
    
    func length() -> Double {
        return sqrt(x * x + y * y + z * z)
    }
}

// 重载乘号(*)
func *(left: Vector3, right: Vector3) -> Double {
    return left.x * right.x + left.y * right.y + left.z * right.z
}

var vector3 = Vector3(x: 1, y: 2, z: 3)
var vector4 = Vector3(x: 2, y: 5, z: -3)

/*
在 swift 2 中自定义操作符
infix operator ^ {
    associativity left    // 左结合
    precedence 145    // 加法是140, 乘法是150. 默认是140。表示优先级高于加法,低于乘法
}
*/

// 在Swift 3 中上面的定义会出现警告信息:Operator should no longer be declared with body;use a precedence group instead
// 在Swift 3 中应该如下自定义操作符
infix operator ^: ATPrecedence
precedencegroup ATPrecedence {
    associativity: left                 // 表示左结合
    higherThan: AdditionPrecedence      // AdditionPrecedence表示加法,优先级高于加法
    lowerThan: MultiplicationPrecedence // MultiplicationPrecedence表示乘法,优先级低于乘法
}

func ^(left: Vector3, right: Vector3) -> Double {
    return acos((left * right) / (left.length() * right.length()))
}

vector3 ^ vector4
infix operator **: BTPrecedence
precedencegroup BTPrecedence {
    associativity: left        // 左结合
    higherThan: AdditionPrecedence  // 优先级高于加法运算符
}

func **(x: Double, y: Double) -> Double {
    return pow(x, y)
}

2 ** 3 ** 2     // 64
1 + 2 ** 3 ** 2 // 65
infix operator **: BTPrecedence
precedencegroup BTPrecedence {
    associativity: right      //右结合
    lowerThan: AdditionPrecedence // 优先级低于加法运算符
}

func **(x: Double, y: Double) -> Double {
    return pow(x, y)
}

2 ** 3 ** 2     // 512
1 + 2 ** 3 ** 2  //19683

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,458评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,030评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,879评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,278评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,296评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,019评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,633评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,541评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,068评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,181评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,318评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,991评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,670评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,183评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,302评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,655评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,327评论 2 358