zoukankan      html  css  js  c++  java
  • Swift技巧(十一)重写运算符

    摘要

    基础数据的运算可以直接使用四则运算符。在 Swift 中也可以通过重写四则运算符的方式,让 struct 或者 class 创建的结构体或者对象也能像基础数据那样直接使用四则运算符。

    Swift 中有经常用到加、减、乘、除的操作,在代码中编写这些操作,实现功能中需要的基础计算。比如下面代码中实现的加法操作。

    let a = 1
    let b = 2
    let c = a + b
    // c = 3
    

    当遇到 struct 或者 class 中的变量做计算操作时,一般都是把属性依次拿出来计算,比如两个 CGPoint 的对象相加:

    let point1 = CGPoint(x: 1, y: 2)
    let point2 = CGPoint(x: 3, y: 4)
    
    // point1 加 point2
    let x = point1.x + point2.x
    let y = point1.y + point2.y
    let result = CGPoint(x: x, y: y)
    

    看代码里面,两个 point 相加要先得到 x 的和,y 的和,然后再创建新的坐标,生成新的坐标。

    逻辑上是没有问题的,如果多个地方出现这样的相加操作,就想到把相加操作给封装成一个函数:

    func addFunc(with point1: CGPoint, point2: CGPoint) -> CGPoint {
    
        let x = point1.x + point2.x
        let y = point1.y + point2.y
        return CGPoint(x: x, y: y)
    }
    

    之后两个坐标的相加操作就可以直接调用 addFunc 函数:

    let result = addFunc(with point1, point2)
    

    这是常规的封装处理,没有毛病,就是有没有更加好的封装方式?比如直接用 + 这个操作呢?

    Swift 中恰好有重写运算符的方式,直接在 struct 或者 class 上使用加、减、乘、除这些操作。那么如何重写运算符呢

    这里依旧以相加两个坐标为例,重写加运算符:

    static func + (_ point1: CGPoint, _ point2: CGPoint) -> CGPoint {
        return CGPoint(x: point1.x + point2.x, y: point1.y + point2.y)
    }
    

    代码中的重写格式一定要是 static func +(属性...)。在函数体中的处理就按照正常的四则运算规则处理。

    之后处理两个坐标相加时,就可以像最开始代码中的那样直接用 + 运算。

    let result = point1 + point2
    

    其他的减、乘、除等运算也可以依照这样的重写格式去处理。

    进阶

    坐标是 CGPoint 结构体的,所以和坐标相关的重写的运算符可以写在 CGPointextension 中,避免重写方法影响到系统级别的运算符

    extension CGPoint {
      static func + (_ point1: CGPoint, _ point2: CGPoint) -> CGPoint {
          return CGPoint(x: point1.x + point2.x, y: point1.y + point2.y)
      }
    }
    

    这里再实现 += 运算符,说明结构体自身运算后仍赋值到自身的场景,用到的是 inout 修饰。

    static func += (point1: inout CGPoint, _ point2: CGPoint) {
        point1.x += point2.x
        point1.y += point2.y
    }
    

    使用上和基础数据的 += 方式也是一样的。

    题外话

    时间仓促,说的东西可能不全面,在你查看的过程中遇到什么问题,评论区给我留言,我会尽快回复

  • 相关阅读:
    UIImageView
    正则表达式
    控制器生命周期和 UIView
    Storyboard
    1218.2——property关键字
    1218.1——OC中的常见关键字及一些基本方法
    1217.2——定义一个类+方法声明调用
    1217.1——OC准备
    1216.2——文件操作
    1216.1——双链表
  • 原文地址:https://www.cnblogs.com/shsuper/p/15658821.html
Copyright © 2011-2022 走看看