Swift开发第六篇——操作运算符也可以重载& func 的参数修饰
本篇分为两部分:
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 的参数修饰的更多相关文章
- Swift开发第十篇——可变参数函数&初始化方法顺序
本篇分为两部分: 一.Swift中的可变参数函数 二.初始化方法的顺序 一.Swift中的可变参数函数 可变参数函数指的是可以接受任意多个参数的函数,在 OC 中,拼接字符串的函数就属于可变参数函数 ...
- Swift开发第八篇——方法嵌套&命名空间
本篇分为两部分: 一.Swift中的方法嵌套 二.Swift中的命名空间 一.Swift中的方法嵌套 在 swift 中我们可以让方法嵌套方法,如: func appendQuery(var url: ...
- Swift开发第七篇——字面量转换&下标
本篇分为两部分: 一.Swift 中的字面量转换 二.Swift 中的下标 一.Swift 中的字面量转换 所谓字面量就是指像特定的数字,字符串或者是布尔值这样能够直接了当地指出自己的类型并未变量进行 ...
- Swift开发第五篇——四个知识点(Struct Mutable方法&Tuple&autoclosure&Optional Chain)
本篇分三部分: 一.Struct Mutable方法 二.多元组(Tuple) 的使用 三.autoclosure 的使用 四.Optional Chain 的使用 一.Struct Mutable方 ...
- Swift开发第十一篇——Designated、Convenience和Required
本篇主要讲解 Swift 中 Designated.Convenience和 Required 的使用: 在 OC 中 init 方法是非常不安全的,没人能够保证 init 只被调用一次,也没有人保证 ...
- Swift开发第四篇——柯里化
本篇分为两部分: 一.柯里化的基本使用 二.柯里化的使用场景 一.柯里化的基本使用 柯里化(Currying):也就是把接受多个参数的方法变换成接受第一个参数的方法,并且返回接受余下的参数并且返回结果 ...
- Python学习【第六篇】运算符
运算符 算数运算: a = 21 b = 10 c = 0 c = a + b print ("1 - c 的值为:", c) c = a - b print ("2 - ...
- Swift开发第三篇——Playground
本篇分为两部分: 一.Playground的延时运行 二.Playground的可视化 一.Playground的延时运行 Playground 就是提供一个可以即时编译的类似 REPL 的环境,他为 ...
- asp.net微信开发第六篇----高级群发(文本)
说到高级群发,微信的参考资料http://mp.weixin.qq.com/wiki/14/0c53fac3bdec3906aaa36987b91d64ea.html 首先我们先来讲解一下群发文本信息 ...
随机推荐
- 跨域名 Cookie 传递测试
问题 我打开了 www.aaa.com 里面的一个页面(www.aaa.com/hello.php),其中这个 hello.php 里面包含一个 <img> 标签,里面的 src 来自于 ...
- Nginx--Windows环境下Nginx+tomcat配置(包括动静分离)
前提条件: (1)已安装好tomcat,且能成功启动 (2)已安装好Nginx,且能成功启动 接下来进行配置: (1)在Nginx的conf文件夹中新增两个文件,分别如下:(新建文件后,直接复制代码即 ...
- [转载]在线文档预览方案-Office Web Apps
最近在做项目时,要在手机端实现在线文档预览的功能.于是百度了一下实现方案,大致是将文档转换成pdf,然后在通过插件实现预览.这些方案没有具体实现代码,也没有在线预览的地址,再加上项目时间紧迫.只能考虑 ...
- [linux]scp指令
实例1:从远处复制文件到本地目录 $scp root@10.6.159.147:/opt/soft/demo.tar /opt/soft/ 说明: 从10.6.159.147机器上的/opt/soft ...
- Direct2D开发:绘制网格
转载请注明出处:http://www.cnblogs.com/Ray1024 一.引言 最近在使用Direct2D进行绘制工作中,需要实现使用Direct2D绘制网格的功能.在网上查了很多资料,终于实 ...
- android和ios,音频互通方案
好久不更新博客上,从年前从公司辞职,这半年以来,一直靠做一些外包app养活自己!也算是达成了自己年前制定的目标!可是也想着总不能一直做外包吧,所以决定做一些自己觉得有意思的app,挂到应用商店上和ap ...
- IOS7中自动计算label的宽度和高度的方法
#import "ViewController.h" @implementation ViewController - (void)viewDidLoad { [super vie ...
- C#-Windows服務以LocalSystem賬戶安裝的話無法獲取我的文檔路徑
如圖,如果Window服務以上圖 Account安裝運行,則無法獲取到 以下路徑: System.Environment.GetFolderPath(Environment.SpecialFolder ...
- ActiveReports 报表应用教程 (1)---Hello ActiveReports
在开始专题内容之前,我们还是了解一下 ActiveReports 是一款什么产品:ActiveReports是一款在全球范围内应用非常广泛的报表控件,以提供.NET报表所需的全部报表设计功能领先于同类 ...
- Apns推送中的的json格式介绍
在开发向苹果Apns推送消息服务功能,我们需要根据Apns接受的数据格式进行推送.下面接受我在进行apns推送时候总结的一点apns服务接受的Json数据格式 示例 1: 以下负载包含哦一个简单的 a ...