本篇分为两部分:

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

2、Swfit 中 func 的参数修饰


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

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

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

struct Vector2D {
var x = 0.0
var y = 0.0
} let v1 = Vector2D(x: , y: )
let v2 = Vector2D(x: , y: )
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 // 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 = ;
let addMethod = makeIncrementor()
addMethod(&i)
addMethod(&i)
addMethod(&i)
addMethod(&i)

Swift开发第六篇——操作运算符也可以重载& func 的参数修饰的更多相关文章

  1. Swift开发第十篇——可变参数函数&初始化方法顺序

    本篇分为两部分: 一.Swift中的可变参数函数 二.初始化方法的顺序 一.Swift中的可变参数函数 可变参数函数指的是可以接受任意多个参数的函数,在 OC 中,拼接字符串的函数就属于可变参数函数 ...

  2. Swift开发第八篇——方法嵌套&命名空间

    本篇分为两部分: 一.Swift中的方法嵌套 二.Swift中的命名空间 一.Swift中的方法嵌套 在 swift 中我们可以让方法嵌套方法,如: func appendQuery(var url: ...

  3. Swift开发第七篇——字面量转换&下标

    本篇分为两部分: 一.Swift 中的字面量转换 二.Swift 中的下标 一.Swift 中的字面量转换 所谓字面量就是指像特定的数字,字符串或者是布尔值这样能够直接了当地指出自己的类型并未变量进行 ...

  4. Swift开发第五篇——四个知识点(Struct Mutable方法&Tuple&autoclosure&Optional Chain)

    本篇分三部分: 一.Struct Mutable方法 二.多元组(Tuple) 的使用 三.autoclosure 的使用 四.Optional Chain 的使用 一.Struct Mutable方 ...

  5. Swift开发第十一篇——Designated、Convenience和Required

    本篇主要讲解 Swift 中 Designated.Convenience和 Required 的使用: 在 OC 中 init 方法是非常不安全的,没人能够保证 init 只被调用一次,也没有人保证 ...

  6. Swift开发第四篇——柯里化

    本篇分为两部分: 一.柯里化的基本使用 二.柯里化的使用场景 一.柯里化的基本使用 柯里化(Currying):也就是把接受多个参数的方法变换成接受第一个参数的方法,并且返回接受余下的参数并且返回结果 ...

  7. Python学习【第六篇】运算符

    运算符 算数运算: a = 21 b = 10 c = 0 c = a + b print ("1 - c 的值为:", c) c = a - b print ("2 - ...

  8. Swift开发第三篇——Playground

    本篇分为两部分: 一.Playground的延时运行 二.Playground的可视化 一.Playground的延时运行 Playground 就是提供一个可以即时编译的类似 REPL 的环境,他为 ...

  9. asp.net微信开发第六篇----高级群发(文本)

    说到高级群发,微信的参考资料http://mp.weixin.qq.com/wiki/14/0c53fac3bdec3906aaa36987b91d64ea.html 首先我们先来讲解一下群发文本信息 ...

随机推荐

  1. MyBatis知多少(9)不同类型的数据库

    并非所有的数据库都如此复杂,需要使用昂贵的数据库管理系统以及企业级的硬件.一些数 据库其实非常小,足以运行在一台老式的PC机上.所有的数据库都是不一样的.它们有各自不 同的需求和不同的挑战.iBATI ...

  2. transactional replication 的immediate_sync属性

    在默认情况下,immediate_sync是关闭的,这个属性可以在创建publication时指定,也可以在创建完毕后修改. 如果immediate_sync为true, snapshot 文件和re ...

  3. git回滚到上一版本

    git reset --hard HEAD~1

  4. 企业云部署要如何选择IaaS PaaS和SaaS

    1为什么IaaS成了灵丹妙药   我非常惊讶,为什么很多传统企业已经接受了云计算,但接受的方式却往往不尽人意.对大多数企业来说,云计算的投入产出比相对较小,并且局限于基础设施层的环节. 就目前而言,大 ...

  5. 【干货分享】Google 的设计准则,素材和资源

    在谷歌,他们说, “专注于用户,所有其它的就会水到渠成 ”.他们遵循设计原则,寻求建立让用户惊喜的用户体验.谷歌一直挑战自己,为他们的用户创造一种视觉语言,综合优秀设计的经典原则和创新.谷歌设计规范是 ...

  6. iOS-动画效果(首尾式动画,代码快动画,核心动画,序列帧动画)

    一.各个动画的优缺点 1.首尾动画:如果只是修改空间的属性,使用首尾动画比较方便,如果在动画结束后做后续处理,就不是那么方面了. 2.核心动画:有点在于对后续的处理方便. 3.块动画: (1)在实际的 ...

  7. 使用Spark分析拉勾网招聘信息(二): 获取数据

    要获取什么样的数据? 我们要获取的数据,是指那些公开的,可以轻易地获取地数据.如果你有完整的数据集,肯定是极好的,但一般都很难通过还算正当的方式轻易获取.单就本系列文章要研究的实时招聘信息来讲,能获取 ...

  8. 【Beta阶段】团队源代码管理

    0. 快速上手与理解 如果你的团队来了一个新队员,有一台全新的机器,你们是否有一个文档,只要设置了相应的权限,她就可以根据文档,从头开始搭建环境,并成功地把最新.最稳定版本的软件编译出来,并运行必要的 ...

  9. 【转】Python中的GIL、多进程和多线程

    转自:http://lesliezhu.github.io/public/2015-04-20-python-multi-process-thread.html 目录 1. GIL(Global In ...

  10. django book 阅读笔记

    一,django是一个十分优秀的python web的框架,那框架的是什么? 假设我们不使用框架来进行编写,我们要用如下的代码进行web脚本: #!/usr/bin/env python import ...