Swift语言学习笔记(七)

原创 2017年01月03日 19:52:12


118.         比特取反运算符“~”将数字的每一个比特位都做取反运算(0变1,1变0),例如:

var m : UInt8 =252        //0b11111100

var n = ~m

println(n)                        //输出3,3=0b00000011

119.         正常情况下,当一个存储数值的变量或常量被赋予一个超出其上限或者下限的数值时,会在运行时抛异常,例如:

var m : Int8 =Int8.max       //m = 127

m +=1                                    //异常

Swift为我们一些越界运算符,越界运算符在基础运算符的左侧加上了一个“&”符号:

&+   &-  &*   &/   &%

注意,传统的加减乘除和取余运算可以使用下面的方式简写:

+=   -=   *=  /=   %=

这种简写不能用于越界运算符。

越界运算符在处理运算的时候,当处理的数字超出了上限或者下限时,会反转到另一端继续计算,例如上面的例子我们做一下修改:

var m : Int8 = Int8.max

m = m &+1                                //m = -128

m = 100

m = m &*3                           //m = 44

120.         正常情况下,由于0不能做除数,因此使用“/”和“%”运算符右侧为0时,会抛异常,但是使用“&/”和“&%”运算时,不会抛异常,返回结果为0:

let x = 10 /0           //   异常

let x = 10 %0         //异常

let x = 10 &/ 0      //x = 0

let x = 10 %/ 0      //x = 0

121.         Swift中使用@infix来重载二元运算符,重载运算符的方法被定义为全局的,例如:

class DemoClass {

    var n : Int = 0

    var s : String = ""

}

@infix  func + (a : DemoClass, b : DemoClass)->DemoClass {

    var temp = DemoClass()

    temp.n = a.n + b.n

    temp.s = a.s + b.s

    return temp

}

Swift使用@prefix和@postfix关键字来定义前置和后置运算符重载,例如“-”和“++”等等。

Swift中使用@assignment关键字来重载组合计算运算符,例如“+=”,“-=”这些运算符:

@assignment func += (inout left : DemoClass, right:  DemoClass) {

left = left +right                //这里重用我们之前重载的“+”运算

}

对于“==”和“!==”运算符,也是用@infix来重载。

122.         在Swift中可以自定义运算符,自定义运算符只能使用下面的运算符来组合:

/  =  -  +  *  % <  >  !  &  |  ^  .  ~

自定义运算符使用operator关键字来定义,需要定义为全局的,operator后面可以是要你管prefix,infix和postfix来修饰:

operator prefix +++ {}

定义好之后就可以对其进行定义了。

我们还可以为自定义的运算符指定其结合性和优先级,结合性的可选值为:left(左结合,当优先级相同的时候,从左向右计算),right(右结合),none,当结合性被设置为none的时候,不允许和优先级相同的运算符组合使用。结合性的关键字为associativity,优先级的关键字为precedence,例如:

operator prefix +++ { associativity leftprecedence 140 }

如果像之前那样不指定结合性和优先级,则默认结合性为left,优先级为100。

如果运算符重载的时候没有歧义,可以省略@prefix,@infix或者@postfix这些关键字。

笔记中的主要部分的内容都是阅读《The Swfit Programming Language》一书整理总结的知识点,学习了Swift之后,最大的一个感觉就是Swift语言真的非常灵活和简洁,可以看到Swift中引入了CC++JavaC#python等语言的很多特性,并且针对其中的一些不方便的地方做了大量的调整,而且Swift针对这些语言中一些容易诱导程序员犯错的语法和特性进行了修改,极大地保证了在编译阶段消除掉那些“坑爹”的bug,而不是在运行的时候遇到那种奇奇怪怪的bug后兜很大一个圈子调试,最后发现自己少写或者写错了一个符号而已。除此之外,可以看到Swift在设计的时候,依然保留了很多Object-C的语法习惯和一些特性,从而保证了苹果开发者从Object-CSwift的过渡更加平滑。

相比于Object-CSwift写代码真的要方便很多了,在语法上,Swift帮助开发者做了很多的简化工作和优化工作,使开发者在使用更简洁的代码开发的同时,不必过多的担心生成代码的效率问题(当然这里不是说那种烂算法导致效率低的问题)。而且Swift和其他高级语言在语法上没有太多的差异,使得熟悉其他高级语言的程序员能够很快的掌握这门语言。

总的来说,从个人角度讲,Swift确实要比Object-C好很多,建议有兴趣的朋友也好好读一读The Swfit Programming Language》这本书,尽管第一章“Atour to Swift”中包罗了书中的大部分特性,但都是泛泛之谈,细读下来,整本书包含的细节内容非常多,包括大量的例子来帮助理解,相信通读下来收获一定不少。

有愿意交流的朋友欢迎加博友一起学习~~

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

初探swift语言的学习笔记四-2(对上一节有些遗留进行处理)

作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/30314359 转载请注明出处 如果觉得文章对你有...

初探swift语言的学习笔记十一(performSelector)

swift 下的performSelector的伪装实现。

swift语言的学习笔记十(block)

在前面一些学习中,原本把闭包给理解成了block尽管有很多相似之处,但block还是有他自己的独特之外。近日,在写oc/swift混合编码时,有时候需要swift回调oc,oc回调swift 。 ...
  • xdrt81y
  • xdrt81y
  • 2015年03月23日 14:53
  • 5589

swift语言的学习笔记四-2(对上一节有些遗留进行处理)

作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/30314359 转载请注明出处 如果觉得文章对你有...
  • xdrt81y
  • xdrt81y
  • 2015年03月23日 14:44
  • 804

初探swift语言的学习笔记一(基本数据类型)

作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/28258805 转载请注明出处 如果觉得文章对你有...

初探swift语言的学习笔记六(ARC-自动引用计数,内存管理)

swift ARC,内存管理。

swift语言的学习笔记一(基本数据类型)

原文地址:http://blog.csdn.net/fengsh998/article/details/28258805 3号,端午刚过,回到公司第一个早上的两小时便贡献给了apple的io...
  • xdrt81y
  • xdrt81y
  • 2015年02月06日 10:24
  • 1016

Swift语言学习笔记(五)

《The Swift Programming Language》的阅读笔记

Swift语言学习笔记(四)

《The Swift Programming Language》的阅读笔记

swift语言的学习笔记五(线程)

swift 并没有使用新一套线程,使用OC源有的一套线程。下面以例子来演示一下swift中使用线程。 其用包括常见的:NSThread,NSOperationQueue,GCG ...
  • xdrt81y
  • xdrt81y
  • 2015年03月23日 14:46
  • 852
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Swift语言学习笔记(七)
举报原因:
原因补充:

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