swift 运算符重载

 

  类和结构体可以位现有的运算符提供自定义的实现。成为运算符重载

code 

//: A UIKit based Playground for presenting user interface
  
import UIKit

struct Vector2D{
    var x = 0.0, y = 0.0

}
extension Vector2D{
static 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 anotherVector = Vector2D(x:2.0,y:4.0)
let combindVector = vector + anotherVector
print(combindVector.x)

print(combindVector.y)

结果都是5

一元运算符重载

类与结构体也能提供标准一元运算符的实现

要实现前缀或后缀运算符,需要在声明运算符函数的时候在func关键字之前指定prefix或postfix限定符

code

//: A UIKit based Playground for presenting user interface
  
import UIKit

struct Vector2D{
    var x = 0.0, y = 0.0

}
extension Vector2D{
static func + (left:Vector2D,right:Vector2D) ->Vector2D {
        return Vector2D(x:left.x+right.x,y:left.y+right.y)
    }
    static prefix func - (vector:Vector2D)-> Vector2D{
        return Vector2D(x:-vector.x,y:-vector.y)
    }
}

let vector = Vector2D(x:3.0,y: 1.0)
let anotherVector = Vector2D(x:2.0,y:4.0)
let combindVector = vector + anotherVector

let negatice = -vector
print(negatice.x)
print(negatice.y)

结果 -3  -1

组合赋值运算符重载

组合复制运算符将赋值运算符(=)与其他运算符进行结合

在实现的时候,需要把运算符的左参数设置成inout类型,因为这个参数的值会在运算符函数内直接被修改

code

//: A UIKit based Playground for presenting user interface
  
import UIKit

struct Vector2D{
    var x = 0.0, y = 0.0

}
extension Vector2D{
 static func += (left: inout Vector2D,right:Vector2D) {
    left = Vector2D(x:left.x+right.x,y: left.y+right.y)
    }

}

var vector = Vector2D(x:3.0,y: 1.0)
let anotherVector = Vector2D(x:2.0,y:4.0)
vector += anotherVector


print(vector.x)
print(vector.y)

结果都是5.0

等价运算符重载

自定义类和结构体不接受等价运算符的默认实现。也就是所谓的『等于』运算符(==)

要使用等价运算符来检查好你自己类型的等价,需要和其他中缀运算符一样提哦那个一个『等于』运算符重载,并且遵循标准库的Equatable协议

code

//: A UIKit based Playground for presenting user interface
  
import UIKit

struct Vector2D{
    var x = 0.0, y = 0.0

}
extension Vector2D{

    static func == (left:Vector2D,right:Vector2D)->Bool{
        return (left.x==right.x)&&(left.y==right.y)
    }
  
}

var vector = Vector2D(x:3.0,y: 1.0)
let anotherVector = Vector2D(x:2.0,y:4.0)



print(vector==anotherVector)

 

结果false

Swift' 为一下自定义类型提供等价运算符合成实现

只拥有遵循Equatable 协议存储的结构体

只拥有Equatable协议关联类型的枚举

没有关联类型的枚举

code

//: A UIKit based Playground for presenting user interface
  
import UIKit

struct Vector3D:Equatable{
    var x = 0.0, y = 0.0,z=0.0

}
let twoThreeFor = Vector3D(x:2.0,y: 3.0,z:4.0)
let antherTwoThreeFour = Vector3D(x: 2.0, y: 3.0, z: 4.0)
print(twoThreeFor == antherTwoThreeFour)

结果

true

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安果移不动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值