Swift_学习笔记_运算符重载

  • 对于自定义的结构体等,需要我们进行运算符的重载,来对自定义的结构体等进行数据处理。

中置运算符

  • 对于结构体,没有加号运算符,下面就以结构体为例,自定义加号运算符。
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)的可取值有lfetrightnone
  • 结合性的默认值none,优先级(precedence)默认为100,范围0~255

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值