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++学习笔记十四-运算符重载

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

C++学习笔记:数组的操作符重载(包括[]和=运算符)

此案例,实现了数组类的操作符重载,包含 [] 和 = 运算符。实现如下: 首先MyArray.h的代码: #include "stdafx.h" #include using namespac...

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

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

c++学习笔记(八):运算符重载的推演

为什么要有运算符重载 先看一个例子: public: Complex(int a, int b) { this->a = a; this->b = b; } public: i...

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

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

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

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

c++学习笔记(三):深拷贝与浅拷贝及等号运算符重载

#include #include //浅拷贝例子 没有自己写复制构造函数而是采用默认的复制构造函数 class name { public : name(char *pn) ; ...

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

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

c++学习笔记5:运算符重载、友元和类的类型转换

1. 运算符重载 1.1 运算符函数的声明 class Time { public: Time operator+(const Time & t)const; }; Time T...

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

运算符重载     对抽象数据类型
  • wxwd1
  • wxwd1
  • 2014年06月27日 10:52
  • 1514
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:swift学习笔记之运算符重载
举报原因:
原因补充:

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