swift学习笔记之运算符重载

原创 2016年05月30日 11:02:23
/**
*  今天我们来谈一谈Swift中的操作符重载,这一功能非常实用,但是也相当有风险。正所谓“能力越大责任越大”,这句话用来形容操作符重载最合适不过了。它可以令你的代码更加简洁,也可以让一个函数调用变得又臭又长。而对于那些没怎么读过你的代码的人来说,操作符的使用同时也会让代码的可读性大打折扣。

谨慎引入,按需使用。比如在连接两个字串的时候你就可以通过重载加法来实现。甚至于你仅在屏幕上输入一个加号,就能响应一个网络链接、播放一段音乐或者完成你能实现的其他任何功能。然而过于复杂的功能对编码来说简直就是灾难,合理的做法就是仅在必要时重载操作符,不做任何多余的事。如果你非要做点奇怪的事,那就为网络响应这样的功能取一个明显又合适的函数名。

无论你何时想采用运算符重载,你都需要考虑一下是否值得重载它而不是用一个函数调用。函数调用或许颇费周折,但更能确切的表达它的功能(如果函数名恰到好处的话)。假如你要频繁做类似于加减乘除赋值比较的操作,那么运算符重载的确是个很合适的解决方案。
*/

/**
*  Swift中的重载运算符里面还是有一些比较不错的地方。你可以通过重载"=="算符来实现对自定义类的比较。假如你想实现这一功能你就需要使用Equatable协议,Equatable协议主要应用于泛型编程(有关Swift的泛型编程可以参考这里)。如果你按照Equatable协议重载了"=="操作符,那么你无需再重载"!="操作符(因为“!=”的重载就是"=="的逻辑否)。
*/

//Globally scoped operator function
func == (left: Temperature, right: Temperature) -> Bool
{
    if left.C == right.C
    {
        return true
    }
    else
    {
        return false
    }
}
//Custom type itself
struct Temperature:Equatable
{
    let C: Double
}
//Test
let tempOne = Temperature(C: 15)
let tempTwo = Temperature(C: 35)
let tempThree = Temperature(C: 15)
let OneTwoEquality = (tempOne == tempTwo)       //Stores:   false
let OneThreeEquality = (tempOne == tempThree)   //Stores:   true

/**
*  前面我讨论了一下NSDate的减法,是因为它在被调用时隐藏了不少的假定条件。在这里提醒一下:当你在考虑编码中是否要实现重载运算符的时候可以想想这个示例。如果你想在代码里一直使用相同的unitFlag来重载实现日期的减法,你需要多写一些代码来考虑多种情况。

如果你想重载内建类型以及不想修改(或者无法修改)的类型的运算符重载,你可以在扩展里面添加这个重载函数。且这个重载函数需要为全局作用域,并放在你随便哪个扩展存放的文件里面。

有一些运算符是不能重载的,最为明显的就是赋值运算"="(一个等号)。
*/

/**
*  Swift提供了许多强大的、现代的编程特性,比如泛型、函数式编程、一等类型(first class)的枚举、结构体等特性。
*/
/**
*  但是现在还有另外一个Swift的特性,你应该知道并且会爱上它,它就是运算符重载。

这是一个很好的方法,你能使用+、-、*、/等操作符作用在你喜欢的任何类型上面。如果你有一定的创造性,你甚至可以定义属于你自己的操作符。
*/

//func add(left: [Int], right: [Int]) -> [Int] {
//    var sum = [Int]()
//    assert(left.count == right.count, "vector of same length only")
//    for (key, _) in enumerate(left) {
//        sum.append(left[key] + right[key])
//    }
//    return sum
//}
//
//var arr1 = [1, 1]
//var arr2 = [1, 1]
//var arr3 = add(arr1, arr2)
/**
*  现在你必须选择一个字符作为你的运算符。自定义运算符可以以/、=、-、+、!、*、%、<、>、&、|、^、~或者Unicode字符开始。这个给了你一个很大的范围去选择你的运算符。但是别太高兴,选择的时候你还必须考虑重复输入的时候更少的键盘键入次数。
在这种情况下,你可以复制粘贴Unicode字符⊕作为很好适应你例子里面加法的实现。

*/
///
版权声明:版权所有,不得转载

Swift教程之运算符重载

原文地址:http://www.raywenderlich.com/80818/operator-overloading-in-swift-tutorial 作者:Corinne Krych  译者:...
  • mengxiangyue
  • mengxiangyue
  • 2015年02月03日 02:51
  • 5376

Swift重载和自定义运算符

最近一直边忙毕设边学Swift,终于看完了官方的教程(语言参考暂不打算看),在iBooks上做了一些笔记(看英文伤不起),感觉Swift是一门大杂烩类型的语言,我会记录一些我自认为以前遇到较少或者需要...
  • imxiangzi
  • imxiangzi
  • 2016年05月05日 13:09
  • 837

九 Swift3.0之 运算符

/* 算术运算符: 除了取模, 其它和OC一样, 包括优先级 + - * / % ++ -- */var result = 10 + 10 result = 10 * 10 result = 10 -...
  • gezi0630
  • gezi0630
  • 2017年03月28日 09:23
  • 783

Swift之运算符重载

//向量struct Vector2D { var x = 0.0 var y = 0.0}//重载加号func + (left: Vector2D, right: Vector2D) -> Vect...
  • a753112701
  • a753112701
  • 2014年09月01日 00:07
  • 317

Swift运算符重载

import Foundationclass Complex { var real = 0 var virtual = 0 init(real: Int,virtual: In...
  • qq_40691827
  • qq_40691827
  • 2017年10月25日 20:01
  • 50

swift运算符重载

首先我们定义一个结构体 当 Point 的两个变量相加时,我们需要这样做: let p1 = Point(x: 1.0, y: 2.0) let p2 = Point(x: 4...
  • linshaolie
  • linshaolie
  • 2014年11月19日 13:32
  • 838

Swift 运算符重载

原文地址:Operator Overloading in Swift Tutorial(raywenderlich) 作者:Corinne Krych  译者:孟祥月(博客):在早前的iOS 8盛宴系...
  • u012524022
  • u012524022
  • 2015年03月11日 19:08
  • 3217

Zynq-Linux移植学习笔记之二-知识点

在zynq上进行Linux的移植并基于Linux进行驱动开发需要涉及到很多东西,用一张图说明要掌握哪些知识: 如上图所示,对开发驱动的人来说,既要懂软件也要懂硬件,软件上需要对操作系统结构和接...
  • jj12345jj198999
  • jj12345jj198999
  • 2017年01月18日 22:53
  • 1402

qt学习笔记(七)之数据库简介

笔者最近用Qt写公司的考勤机。本来要求是要基于frameBuffer下用自己开发的easyGUI来进行上层应用开发,但是考虑到easyGUI提供的接口不是很多,就考虑用Qt来开发,顺带练练手。 废话不...
  • liuligui5200
  • liuligui5200
  • 2015年07月09日 15:59
  • 364

数学之美学习笔记(1)

第1章    文字和语言vs数字和信息 文字按照意思来聚类,最终回带来一些歧义。上下文建立的概率模型也会出现错误。 罗塞塔石碑对自然语言处理的两点指导意义: 1.      信息的冗余是信息安全...
  • u010963351
  • u010963351
  • 2016年01月14日 10:03
  • 233
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:swift学习笔记之运算符重载
举报原因:
原因补充:

(最多只允许输入30个字)