每天学一点Swift---- 运算符函数

来源:互联网 发布:rgb转化到hsv的算法 编辑:程序博客网 时间:2024/05/20 22:27

运算符重载


1. Swift的运算符提供了良好的可扩展性,Swift不仅允许开发者重新定义已有的运算符(运算符重载),甚至允许开发者实现新的运算符。从本质上来看,Swift的运算符其实就是一个运算符函数,因此只要能用函数实现的功能,程序都可以讲起转换为运算符。


2. 重新定义+-x/的运算符函数,实现自己认为合理的功能就是运算符重载(函数重载),不再啰嗦。


3. 举个例子,使用+对数组进行添加元素:

func + <T> (var left : [T], right : T) -> [T]

{

   left.append(right)

   return left

}


.前置和后置运算符

1. 重载单目运算符时,Swift允许指定单目运算符必须放在操作数的前面或后面,如果单目运算符必须放在操作数的前面,这种运算符被称为前置运算符;如果单目运算符必须放在操作数的后面,这种运算符被称为后置运算符。


2. 前置运算符必须使用prefix关键字修饰;后置运算符必须使用postfix关键字修饰。


3. 扩展后的赋值运算符:我们已经知道:a += b相当于a = a+b。实际上+=也是可以被重载的运算符。由于+=运算符会改变第一个操作数,因此程序重载+=运算符时需要将第一个操作数设置为In-Out模式。除此之外,+=运算符的作用是改变第一个数的值,因此重载+=运算符时无须指定返回值类型。


.比较运算符

1. 如果程序要使用==!=>>=<<=这些运算符对自定义类型比较大小,则可以让该自定义类型满足如下两个特征:

1)遵守EquatableComparable两个协议

2)对自定义类型重载==<两个运算符


2. Swift并不要求程序重载!=>>=<=4个运算符,只要程序为自定义类型重载了==<两个运算符,Swift将会自动推断出其他4个云是个的比较结果。


3. 如果程序并不需要比较来两个自定义类型的大小,只是比较它们相等或不相等,则只需要让该自定义类型实现Equatable协议,并为该自定义类型重载==运算符即可。


.自定义运算符

1. 除了上面的运算符重载之外,Swift甚至允许程序定义自己的运算符函数,如果程序定义了新的运算符函数,那就相当于为Swift增加了新的运算符。


2. 新增运算符只能使用 =+-*/%<>、!、|^~这些符号。


3. 开发自定义四运算符只要如下两步即可:

1)声明新的运算符,格式如下:

    prefix|infix|postfix operator运算符名{}   ----prefixinfixpostfix三者只能出现一个,分别表示前置、双目、后置。

2)根据业务需要,为新的运算符提供多个重载的运算符函数。


4. 举个栗子:

//为新的运算符定义函数,用来实现乘方运算

func ** (base : Int, exponent : Int) -> Int

{

   var resule = 1

   for _ in 1...exponent

   {

       result *= base

   }

   return result

}


func ** (base : Double, exponent : Int) -> Int

{

   var result  = 1.0

   for _ in 1...exponent

   {

result *= base

   }

   return result

}


5. 自定义运算符的结合性(associativity)和优先级(precedence

1)运算符的结合性决定运算符是先和左边操作数还是右边操作数结合。结合性支持的值有left(左结合)、right(右结合)、none(非结合运算符)。

2)运算符的优先级决定该运算符是否会被优先计算。

3)自定义的infix运算符可以指定结合性和优先级,如果没有为自定义运算符指定结合性,该运算符的结合性默认为none,如果没有为自定义运算符指定优先级,该运算符的优先级为100


6. 下面的代码重写定义了**=运算符,并指定了该运算符的结合性和优先级:

infix operator **= {associativity left precedengce 90}



阶段性小记

  历时一个多月,终于将Swift的基础语法过了一遍,离开发iOS又进了一步。虽然知识是看完了,但是记住了没有多少,更不要说融会贯通了,所以接下来的一步就是要温故而知新。把学习过的知识再从头串联一遍,并且要在代码和demo中实践起来了。所以接下来不会再注重日记的更新,而是要在有知识大体思路的框架逐步去深入学习具体的知识,然后把学习的内容用自己的方式加自己的想法记录下来才会更有效率吧,加油喽!


上一篇:每天学一点Swift----泛型(二)

原创粉丝点击