Swift之运算符重载示例详解

 更新时间:2023年07月07日 10:49:16   作者:大刘  
这篇文章主要为大家介绍了Swift之运算符重载示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

在C++中, 运算符是可以重载的, Swift也是支持的

注:=和三目运算符a ? b : c不可重载

重载双目运算符

class Vector {
    var x: Double = 0.0
    var y: Double = 0.0
    var z: Double = 0.0
    init(x: Double, y: Double, z: Double) {
        self.x = x
        self.y = y
        self.z = z
    }
    convenience init() {
        self.init(x: 0, y: 0, z: 0) 
    }
    /// Operator '+' declared in type 'Vector' must be 'static'
    /// + 是双目运算符,两个参数
    static func +(v1: Vector, v2: Vector) -> Vector {
        let vector: Vector = Vector()
        vector.x = v1.x + v2.x
        vector.y = v1.y + v2.y
        vector.z = v1.z + v2.z
        return vector
    }
}

单目运算符

类和结构体也可以实现单目运算符,单目运算符只运算一个值。

运算符出现在值之前为前缀运算符(prefix, 如 -a),出现在值之后为后缀运算符(postfix, 如a!)。

struct Coordinate {
    var x: Double = 0.0
    var y: Double = 0.0
    static prefix func +(coordinate: Coordinate) -> Coordinate {
        return Coordinate(x: +coordinate.x, y: +coordinate.y)
    }
    static prefix func -(coordinate: Coordinate) -> Coordinate {
        return Coordinate(x: -coordinate.x, y: -coordinate.y)
    }
}
func test() {
    let p1 = Coordinate(x: 1.0, y: 1.0)
    let p2 = Coordinate(x: 2.0, y: 2.0)
    print(-p1) // Coordinate(x: -1.0, y: -1.0)
    print(+p2) // Coordinate(x: 2.0, y: 2.0)
}

复合赋值运算符

复合赋值运算符是赋值运算符(=)和其他运算符进行结合, 如 +=、-=

struct Coordinate {
    var x: Double = 0.0
    var y: Double = 0.0
    // 如果放在全局函数里, 不需要加static, 否则, static不可省略
    static func +=(left: inout Coordinate, right: Coordinate) {
        left = Coordinate(x: left.x + right.x, y: left.y + right.y)
    }
    static func -=(c1: inout Coordinate, c2: Coordinate) {
        left = Coordinate(x: left.x - right.x , y: left.y - right.y)
    }
}
func test() {
    var p1 = Coordinate(x: 1.0, y: 1.0)
    let p2 = Coordinate(x: 2.0, y: 2.0)
    p1 += p2
    print(p1) // Coordinate(x: 3.0, y: 3.0)
}

等价运算符 ==

自定义类和结构体没有对等价运算符进行默认的实现。等价运算符一般被称为相等运算符==和不等运算符 !=

struct Coordinate {
    var x: Double = 0.0
    var y: Double = 0.0
    static func ==(c1: Coordinate, c2: Coordinate) -> Bool {
        return c1.x == c2.x && c1.y == c2.y
    }
    static func !=(left: Coordinate, right: Coordinate) -> Bool {
        return left.x != right.x || left.y != right.y
    }
}
func test() {
    let p1 = Coordinate(x: 1.0, y: 1.0)
    var p2 = Coordinate(x: 2.0, y: 2.0)
    print(p1 == p2) // false
    p2.x -= 1
    p2.y -= 1
    print(p1 == p2) // true
}

自定义运算符

可以自定义前置运算符prefix、后置运算符postfix、中置运算符infix, 约束条件:

  • 只能使用如下字符:
    - + * / = % < > ! & | ^ . ~
  • 只有中置运算符可以继承优先级组 precdence(后面介绍)
  • 自定义运算符不可放在类中,必须放在文件作用域中

自定义后置运算符

struct Coordinate {
    var x: Double = 0.0
    var y: Double = 0.0
}
// 文件作用域,即全局作用域,不可在class下
prefix operator +++
prefix func +++(coordinate: inout Coordinate) -> Coordinate {
    coordinate.x = coordinate.x + coordinate.x
    coordinate.y = coordinate.y + coordinate.y
    return coordinate
}
func test() {
    var p1 = Coordinate(x: 1.0, y: 1.0)
    print(+++p1) // Coordinate(x: 2.0, y: 2.0)
}

自定义前置运算符和自定义后置运算符类似

postfix operator +++
postfix func +++(coordinate: inout Coordinate) -> Coordinate {
    coordinate.x = coordinate.x + coordinate.x
    coordinate.y = coordinate.y + coordinate.y
    return coordinate
}

自定义中置运算符

precedencegroup MyPrecedence {
    // higherThan: AdditionPrecedence   // 优先级, 比加法运算高
    lowerThan: AdditionPrecedence       // 优先级, 比加法运算低
    associativity: none                 // 结合方向:left, right or none
    assignment: false                   // true代表是赋值运算符,false代表非赋值运算符
}
infix operator +++ : MyPrecedence  // 继承 MyPrecedence 优先级组(可选)
func +++(left: Int, right: Int) -> Int {
    return (left + right) * 2
}
func test() {
    print(3+++2)
}

借助自定义运算符,我们可以浪一浪,定义一个操作符,当有值是使用此值,无值时使用想要的默认值,如下所示:

postfix operator <<<
postfix func <<<(a: String?) -> String { return a ?? "" }
func test() {
    print(getStr()<<<)
}
func getStr() -> String? {
    return nil
}

示例

postfix operator <<<
postfix func <<<(a: String?)              -> String              { return a ?? "" }
postfix func <<<(a: Int?)                 -> Int                 { return a ?? 0 }
postfix func <<<(a: Int8?)                -> Int8                { return a ?? 0 }
postfix func <<<(a: Int16?)               -> Int16               { return a ?? 0 }
postfix func <<<(a: Int32?)               -> Int32               { return a ?? 0 }
postfix func <<<(a: Int64?)               -> Int64               { return a ?? 0 }
postfix func <<<(a: UInt?)                -> UInt                { return a ?? 0 }
postfix func <<<(a: Double?)              -> Double              { return a ?? 0.0 }
postfix func <<<(a: Float?)               -> Float               { return a ?? 0.0 }
postfix func <<<(a: [AnyObject]?)         -> [AnyObject]         { return a ?? [] }
postfix func <<<(a: [String]?)            -> [String]            { return a ?? [] }
postfix func <<<(a: [Int]?)               -> [Int]               { return a ?? [] }
postfix func <<<(a: [String: AnyObject]?) -> [String: AnyObject] { return a ?? [:]}
postfix func <<<(a: [String: String]?)    -> [String: String]    { return a ?? [:] }

以上就是Swift之运算符重载示例详解的详细内容,更多关于Swift运算符重载的资料请关注脚本之家其它相关文章!

相关文章

  • 详解Swift语言中的类与结构体

    详解Swift语言中的类与结构体

    这篇文章主要介绍了Swift语言中的类与结构体,是Swift入门学习中的基础知识,需要的朋友可以参考下
    2015-11-11
  • 快速排序算法在Swift编程中的几种代码实现示例

    快速排序算法在Swift编程中的几种代码实现示例

    快速排序是一种不稳定的排序,存在着优化空间,这里我们来看快速排序算法在Swift编程中的几种代码实现示例:
    2016-07-07
  • Swift中的可变参数函数介绍

    Swift中的可变参数函数介绍

    这篇文章主要介绍了Swift中的可变参数函数介绍,本文实现了和Objective-C调用方法一样的变参数函数,需要的朋友可以参考下
    2015-01-01
  • Swift开发应用中如何更方便地使用颜色详解

    Swift开发应用中如何更方便地使用颜色详解

    这篇文章主要给大家介绍了关于Swift开发应用中如何更方便地使用颜色的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-03-03
  • Swift在控件中添加点击手势的方法

    Swift在控件中添加点击手势的方法

    这篇文章主要介绍了Swift在控件中添加点击手势的方法,本文讲解如何在tableview的headerview中添加点击手势的方法,需要的朋友可以参考下
    2015-01-01
  • Swift中添加双击手势识别器

    Swift中添加双击手势识别器

    在这次IOS应用开发教程中,我们打算实现手势识别。正如你所知道的,IOS支持大量的手势操作,它们能提供了很好的应用控制和出色用户体验。
    2019-08-08
  • Swift中优雅处理闭包导致的循环引用详解

    Swift中优雅处理闭包导致的循环引用详解

    这篇文章主要给大家介绍了关于Swift中优雅的处理闭包导致的循环引用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Swift具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • 在一个项目中同时使用Swift和Objective-C代码混合编程的方法

    在一个项目中同时使用Swift和Objective-C代码混合编程的方法

    这篇文章主要介绍了在一个项目中同时使用Swift和Objective-C代码的方法,在一个工程中同时使用Swift和Objective-C混合语言编程的方法,需要的朋友可以参考下
    2014-07-07
  • Swift运算符使用方法浅析

    Swift运算符使用方法浅析

    Swift 语言支持大部分标准 C 语言的运算符,并且改进了许多特性来使我们的代码更加规范,其中主要包含算数运算符、区间运算符、逻辑运算符、关系运算符、赋值运算符、自增自减运算符、溢出运算符等
    2022-09-09
  • 浅析Swift中struct与class的区别(汇编角度底层分析)

    浅析Swift中struct与class的区别(汇编角度底层分析)

    这篇文章主要介绍了Swift中struct与class的区别 ,本文从汇编角度分析struct与class的区别,通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03

最新评论