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字符⊕作为很好适应你例子里面加法的实现。

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

相关文章推荐

C#学习笔记: 运算符重载、override、get和set访问器

最近工作需要,得学习C#,Windows API的学习只好暂时告一段落。 面象对象没基础,记点小白记录,直接从C#100例上拿的程序,因为涉及到运算符重载、override、get和set访问器,都...

c++学习笔记--由复数类看运算符重载

#include #include using namespace std; class Complex;//前置声明 在一个需要声明未定义完成的类,比如 Complex 还未定义 之前要声明有这...

C++学习笔记十四-运算符重载

转自:http://www.cnblogs.com/ForFreeDom/archive/2012/05/26/2519003.html 概述:C++ 允许我们重定义操作符用于类类型对象时的...

C++ Primer Plus学习笔记之运算符重载

C++ Primer Plus学习笔记之运算符重载

C++编程思想学习笔记---第12章 运算符重载

C++编程思想学习笔记—第12章 运算符重载 运算符重载只是一种语法上的方便,只是另一种形式的函数调用。 应当说明,运算符重载不应该被滥用,只有在能使涉及类的代码更易写,特别是更易读时,才有...

c++学习笔记--带有动态空间申请的类成员变量的类的运算符重载

声明代码出处:http://www.weixueyuan.net/view/6388.html 内存管理操作符new、new[]、delete和delete[]同样也可以进行操作符重载 ...

初探C++运算符重载学习笔记<1>

运算符重载     对抽象数据类型
  • wxwd1
  • wxwd1
  • 2014-06-27 10:52
  • 1459

PKU C++程序设计实习 学习笔记4 运算符重载

第四章 运算符重载 4.1 运算符重载的基本概念 1. 运算符 2. 自定义数据类型与运算符重载 C++提供了数据抽象的手段:用户自己定义数据类型 -- 类 • 调用类的成员函数—>操作它的对象 类...

【C++】学习笔记五十一——运算符重载

运算符重载可对运算符进行重载,将运算符扩展到自定义类型。operator【运算符】(argument-list)例如:operator+()重载+运算符。【运算符】必须是有效的C++运算符,不能虚构一...

运算符重载学习笔记

定义一个复数类Complex,重载运算符“+”,使之能用于复数的加法运算。 将运算符函数重载为非成员、非友元的普通函数。 编写程序,求两个复数的和。
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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