zoukankan      html  css  js  c++  java
  • Swift开发第六篇——操作运算符也可以重载& func 的参数修饰

    本篇分为两部分:

    1、Swift 中重载操作运算符的使用

    2、Swfit 中 func 的参数修饰


    1、Swift 中重载操作运算符的使用

    与别的语言不同,Swift 支持运算符的重载,运算符指的是“+,-,%,*”等操作运算符,从而使一些操作更加简便。

    在开发中,我们对于一些基本运算通常是这样写的:

    struct Vector2D {
        var x = 0.0
        var y = 0.0
    }
    
    let v1 = Vector2D(x: 2, y: 3)
    let v2 = Vector2D(x: 1, y: 4)
    let v3 = Vector2D(x: v1.x+v2.x, y: v1.y+v2.y)

    v3 的输出结果为:3,7

    但是,当这种二位数组过多时,如果我们依然用这种方式,我们的代码将变得异常臃肿,程序员也会变得没有耐心,所以 Swift 为了提高工作效率,创造出了重载运算符这种文艺的编程方式,上面的代码可以优化为:

    // Swift 支持重载操作符这样的特性,从而使一些计算更加简便
    func +(left: Vector2D, right:Vector2D) -> Vector2D {
        return Vector2D(x: left.x + right.x, y: left.y + right.y)
    }
    
    let v = v1 + v2 + v3  // 再往后继续加都可以

    v 的输出结果为:6,14

    因为 +, -, * 这样的操作符是因为 Swift 中已经有定义了,所以不会保错,如果我们要加入新的操作符的话,需要先对其进行声明

    infix operator +* {  // infix:表示要定义的是一个中位操作符,即前后都是输入;其他的修饰还包括 prefix 和 postfix
        associativity none  // associativity:定义结合律,规定计算顺序,加法减法为 left,点乘用 none
        precedence 160    // precedence:运算的优先级,Swift 中乘除的优先级是150,加减是140
    
    }
    func +*(left: Vector2D, right:Vector2D) -> Double {
        return left.x * right.x + left.y * right.y
    }
    let result1 = v1 +* v2

    result1 的输出结果为:14.0

    注意:Swift 的操作符是不能定义在局部域中的,因为至少会希望能在全局范围内使用你的操作符,否则操作符就失去意义了


    2、Swfit 中 func 的参数修饰

    在 Swift 中所有的变量都被默认为不可变的,也就是用 let 进行声明,在方法上也是如此,所以此代码会报错:func test(i: Int) -> Int

    解决办法:

    func incrementor(var i: Int) -> Int {
        return ++i
    }
    print("计算后的结果为:(incrementor(7))")

    输出结果:计算后的结果为:8

    // 柯里化及多元组综合使用, inout 修饰符曾在多元组中使用
    func makeIncrementor(addNumber: Int) -> ((inout Int) -> ()) {
        func incrementor(inout variable: Int) -> () {
            variable += addNumber;
            print(variable);
        }
        return incrementor;
    }
    var i = 2;
    let addMethod = makeIncrementor(3)
    addMethod(&i)
    addMethod(&i)
    addMethod(&i)
    addMethod(&i)
  • 相关阅读:
    xml 总结(一)数据岛,命名空间
    activiti designer 安装到 myeclipse
    activiti5.15 学习笔记
    goole网址IP
    form 中Enctype=multipart/form-data 的作用
    上传文件form表单enctype="multipart/form-data"传值解决办法(代原代码)
    淘宝初始化样式
    js闭包使用之处
    CSS Sprites
    iframe用的场景
  • 原文地址:https://www.cnblogs.com/Jepson1218/p/5285794.html
Copyright © 2011-2022 走看看