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中引入了C,C++,Java,C#,python等语言的很多特性,并且针对其中的一些不方便的地方做了大量的调整,而且Swift针对这些语言中一些容易诱导程序员犯错的语法和特性进行了修改,极大地保证了在编译阶段消除掉那些“坑爹”的bug,而不是在运行的时候遇到那种奇奇怪怪的bug后兜很大一个圈子调试,最后发现自己少写或者写错了一个符号而已。除此之外,可以看到Swift在设计的时候,依然保留了很多Object-C的语法习惯和一些特性,从而保证了苹果开发者从Object-C到Swift的过渡更加平滑。
相比于Object-C,Swift写代码真的要方便很多了,在语法上,Swift帮助开发者做了很多的简化工作和优化工作,使开发者在使用更简洁的代码开发的同时,不必过多的担心生成代码的效率问题(当然这里不是说那种烂算法导致效率低的问题)。而且Swift和其他高级语言在语法上没有太多的差异,使得熟悉其他高级语言的程序员能够很快的掌握这门语言。
总的来说,从个人角度讲,Swift确实要比Object-C好很多,建议有兴趣的朋友也好好读一读《The Swfit Programming Language》这本书,尽管第一章“Atour to Swift”中包罗了书中的大部分特性,但都是泛泛之谈,细读下来,整本书包含的细节内容非常多,包括大量的例子来帮助理解,相信通读下来收获一定不少。
有愿意交流的朋友欢迎加博友一起学习~~