苹果新的编程语言 Swift 语言进阶(三)--基本运算和扩展运算
一 基本操作运算
1、 赋值操作
在Swift 中,能够使用赋值操作为一个常量或一个变量赋值,也能够使用多元组一次为多个常量或变量赋值。
Swift 的赋值操作与其他语言最大的不同是赋值操作除了可以为变量或常量赋值外本身不可以返回值。
这个特征能够避免某些条件下赋值操作错误地用于相等比較操作。
如在C语言中,if (x = =y) 非常easy误写作if (x = y) ,尽管逻辑结果不对,但C语言的编译器却无法检查出这样的情况,而Swift 语言却能够有效避免这样的情况发生。由于
在Swift 中if (x = y)是无效错误的语句,Swift 规定赋值操作不能返回值。因此Swift 编译器可以检查出这样的错误,这也说明使用Swift语言编程可以更加有效和安全。
2、 算术操作
Swift 语言对全部的数值类型支持标准的加减乘除(+-*/)四种基本算术操作。
而Swift 语言相对C 和 Objective-C改善的地方是算术操作默认不同意溢出。
当然你能够选择使用和支持溢出操作。
3 、取余操作(%)
Swift 的取余操作除了支持针对整数类型的取余操作外,还支持对浮点数的取余操作。
如8 % 2.5 // equals 0.5
4、 比較操作
Swift支持C语言提供的全部标准的比較操作。另外Swift还提供两个同一操作符(=== 和!==),用来測试比較两个对象引用类型是否引用的是同样的对象。
5 、逻辑操作
Swift支持C语言标准的三个逻辑操作:非操作(!a)、与操作(a && b)、或操作(a || b)。
用来组合和改动布尔值。
6 、一元操作
Swift支持C语言标准的++和--操作。
另外Swift还提供减号操作,用来改变一个具有符号的数值类型的符号,如正数改变为负号,负号改变为正号。
相对的还提供有加号操作,尽管加号操作不起不论什么作用。
也提供复合赋值操作(赋值操作和其他操作的符合)。复合赋值操作也不支持返回值。
7 、三元操作
Swift支持一个标准的C语言提供的三元操作:
(question ? answer1 : answer2)。用来依据条件question的返回的布尔值的不同而返回不同的结果,即question为true 返回answer1,否则answer2。
8 、范围操作
Swift包含两个范围操作符运算:一个闭合范围操作(a...b),a和b都包含。一个半闭合范围操作(a..b)。不包含b。
范围操作通经常使用于for-in 循环中,用于遍历该范围。
二 扩展操作运算
1 、位操作
Swift 支持全部的C语言支持的位操作。包含位非(~) 、位与(&) 、位或(|) 、位异或(^)、位左移(<<)和位右移(>>) 等操作。
2 、溢出操作
当试图改动一个整数常量或变量的值超出该整数可以保持的最大数或最小数时,Swift默认报告一个执行时错误。如一个整形Int16变量或常量的最大值为32767。最小值为-32768。假设设置Int16类型变量大于32767或小于-32768,则Swift默认报告一个执行时错误。
如例如以下语句将报告一个执行时错误。
varpotentialOverflow =Int16.max
potentialOverflow += 1
但是Swift也同意用户在溢出时选择其他溢出行为,而不是默认报告一个错误。
Swift对于整数运算提供5个可以选择溢出行为的算术溢出操作,这些操作都以符号&开头:溢出加(&+)、溢出减(&-)、溢出乘(&*)、溢出除(&/)、溢出取余(&%)。
varwillOverflow =UInt8.max
willOverflow =willOverflow &+1
willOverflow =willOverflow &+1// willOverflow is now equal to 0
以上样例所看到的,willOverflow变量在第一条语句被初始化为一个八位整形(UInt8)值可以保持的最大值(255),接着使用溢出加操作来使其加1。这将使变量willOverflow出现溢出。
然而计算结果不是报告一个执行时错误。而是恢复到该整形变量可以保持的最小值0.
其他整形变量的溢出操作相同。
总之对一个整形变量运行可以造成上溢的溢出操作。溢出运算结果将从最大的有效值轮回变成最小值。对某个整形变量运行溢出操作造成下溢,(如在一个初始值为其最小值的整形变量上运行溢出减操作)。溢出运算结果将从最小值轮回变成最大值。
varsignedUnderflow =Int8.min
// signedUnderflow 如今等于Int8整形的最小值是 -128
signedUnderflow =signedUnderflow &-1
// 在signedUnderflow 上运行溢出减一后结果变回Int8整形的最大值 为127
默认情况,一个数运行除0(i / 0)或者零取余(i % 0)操作将引起执行时错误。
但是对一个数执行溢出除0(i &/0)或者0溢出取余(i & % 0)操作。结果为0,而不出现错误。
3 、操作函数
类和结构类型可以定义自己的操作函数,来实现或覆盖某些已经存在操作运算符操作。
例如以下所看到的。在keywordfunc前面加入一个@infix属性来声明和定义一个二元加操作函数,来对Vector2D结构的实例运行加操作:
structVector2D {
varx =0.0,y =0.0
}
@infixfunc + (left:Vector2D,right:Vector2D) ->Vector2D {
returnVector2D(x:left.x +right.x,y:left.y +right.y)
}
上面定义了一个全局的二元加操作函数。函数名为“+”。函数输入两个类型为Vector2D的參数,返回一个类型也是Vector2D的输出值。
该“+”函数的运行效果与一个标准的二元加操作相似,函数名称+作为定义的操作函数的二元操作符。两个定义的命名为left和right的输入參数(代表Vector2D实例)作为其二元操作数,函数运算结果返回一个新的Vector2D实例,其x和y属性被初始化为两个输入Vector2D实例的x和y属性的对应加的结果。
因为该定义的操作函数为一个全局函数,而不是Vector2D 结构的方法。所以可以对两个存在的Vector2D实例进行二元加操作,例如以下所看到的。
letvector =Vector2D(x:3.0,y:1.0)
letanotherVector =Vector2D(x:2.0,y:4.0)
letcombinedVector =vector +anotherVector
也能够为类或结构类型定义相等操作(==)和不等操作(!=)两个二元操作函数。也是使用二元操作属性infix来标识,例如以下所看到的:
@infixfunc == (left:Vector2D,right:Vector2D) ->Bool {
return (left.x == right.x) && (left.y == right.y)
}
@infixfunc != (left:Vector2D,right:Vector2D) ->Bool {
return !(left ==right)
}
相同,也能为类或结构提供标准的一元运算符操作函数的实现。
当你实现一个一元操作函数时。使用@prefix属性来作为其属性,标识是一个一元前缀操作,使用@postfix属性来定标识实现的是一个一元后缀操作。如:
@prefixfunc - (vector:Vector2D) ->Vector2D {
returnVector2D(x: -vector.x,y: -vector.y)
}
还可以为类或结构定义复合分配操作函数,一个复合分配操作函数使用@assignment属性来标识。与其他操作函数不同的是你必须标记复合分配操作函数的左输入參数作为inout类型,由于该參数须要可以在操作函数内被直接改动。
例如以下样例实现了一个为Vector2D实例运行分配加操作的函数:
@assignmentfunc += (inoutleft:Vector2D,right:Vector2D) {
left =left +right
}
@assignment 属性 还可以与@prefix 或 @postfix属性组合来定义其他组合型一元操作。
例如以下为Vector2D实例定义了一个一元‘++’操作函数。
@prefix@assignmentfunc ++ (inoutvector:Vector2D) ->Vector2D {
vector +=Vector2D(x:1.0,y:1.0)
returnvector
}
须要注意的是不能给类或结构定义单独的赋值操作(=),还有三元操作(a ?
b : c) 。
4 、定制操作
除了实现Swift提供的标准的操作。Swift还支持用户声明和实现自己的定制操作符。
Swift支持的定制操作符名仅能从符号“/ = - + * % < > ! & | ^ . ~.”之间选择。
新的定制操作符使用operatorkeyword在全局级别声明。并可以声明为prefix,infix或postfix操作类型。例如以下定义了一个新的称作“+++”的前缀操作:
operatorprefix +++ {}
在定义了新的操作符后。你就能够像Swift提供的标准操作符一样使用,如为结构或类定义新的操作函数,例如以下使用刚新定义的操作符实现了一个对Vector2D实例运行新操作符功能的操作函数。
@prefix@assignmentfunc +++ (inoutvector:Vector2D) ->Vector2D {
vector +=vector
returnvector
}
上面对Vector2D 结构的+++实现,用来实现Vector2D实例本身的相加。
例如以下所看到的:
vartoBeDoubled =Vector2D(x:1.0,y:4.0)
letafterDoubling = +++toBeDoubled
// toBeDoubled now has values of (2.0, 8.0)
// afterDoubling also has values of (2.0, 8.0)
Swift也能 为 定制的二元操作符(Infix)指定相关的优先级和关联性。假设不指定,默认的优先级为100,关联性为none。例如以下定义了一个定制的二元操作符称作’+-’,并指定左关联,优先级为140(和Swift提供的标准加二元运算符的设置同样).
operatorinfix +- {associativityleftprecedence140 }
版权全部,请转载时注明链接和出处!
苹果新的编程语言 Swift 语言进阶(三)--基本运算和扩展运算相关推荐
- 苹果新的编程语言 Swift 语言进阶(一)--综述
Swift 是苹果开发和提供的供开发IOS 和OS X应用的一门新的语言.Swift语言基于C 和Objective-C语言,除了提供C 和Objective-C语言具有的所有语法功能外,为了编程方便 ...
- 苹果新的编程语言 Swift 语言进阶(二)--基本数据类型
一 . 常量和变量 Swift语言 对常量和变量的声明进行了明白的区分 Swift语言的常量类型比C 语言的constants类型更加强大,语义更加明白. 常量和变量的差别是常量在设置或初始化后 ...
- 苹果新的编程语言 Swift 语言进阶(十三)--类型检查与类型嵌套
一 类型检查 1. 类型检查操作符 类型检查用来检查或转换一个实例的类型到另外的类型的一种方式. 在Swift中,类型检查使用is和as操作符来实现. is操作符用来检查一个实例是否是某种特定类型,如 ...
- A Swift Tour, 苹果新推出的开发语言
苹果近日召开了全球开发者大会(WWDC),推出了一种新的开发语言 Swift,有人说是用来替代Objective-C的,以下是苹果官方文档,第一时间整理了一下,觉得还是很有前景的,有些英文看不懂的就直 ...
- 苹果公司的新的编程语言 Swift 高级语言()两--基本数据类型
一 . 常量和变量 Swift语言 对常量和变量的声明进行了明白的区分 Swift语言的常量类型比C 语言的constants类型更加强大,语义更加明白. 常量和变量的差别是常量在设置或初始化后 ...
- playgrounds能运行c语言吗,儿童学编程语言 swift语言playgrounds第一课
swift playgrounds 编程界面 但是包括scratch在内的其他多数的儿童学习软件,基本都没有接触到代码层面,主要还是学习的是编程思维,转而学习真正的编程语言比如python时,还是要从 ...
- c语言位运算负数的实例_0基础学习C语言第三章:位运算
C语言提供了六种位运算符: & 按位与 | 按位或 ^ 按位异或 ~ 取反 << 左移,相当与*2 >> 右移,正数高位补0,负数由计算机决定 循环左移k次 (x< ...
- 苹果编程语言Swift解析:将推动应用开发巨变
苹果编程语言Swift解析:将推动应用开发巨变 以下为文章全文: 许多人可能都已忘记苹果WWDC中的"D"代表了"开发者".这是一次开发者的大会, ...
- Lyft押重注于苹果编程语言Swift
Lyft押重注于苹果编程语言Swift 1年后获得丰厚回报BI中文站 8月22日报道 一年多以前,打车应用Lyft做出重大决定,决心押重注于苹果开发的编程语言Swift,用这种编程语言重写其所有iPh ...
最新文章
- PYQT5登录界面跳转主界面方法
- 《大话数据结构》读书笔记-查找
- C++ Primer 5th笔记(chap 19 特殊工具与技术)malloc 函数与 free 函数
- 好文推荐 | 缓存与数据库一致性问题深度剖析 (修订)
- androidstudio调用系统相机为什么resultcode一直返回0_函数递归调用?看这文就够了...
- 百度、阿里等大厂面试技巧总结,Java工程师必看!
- yum命令报错 yum update File /usr/bin/yum, line 30 except KeyboardInterrupt, e: --CentOS7.5
- JS实现图片拖动验证
- 渗透测试之信息收集(下篇)
- 打印机共享,局域网打印机连接,安装驱动,安装打印机等问题总结
- 用gin+xorm+docker编写Online Judge后端
- 钳位二极管的工作原理
- 三口烧瓶规格有哪些_三口烧瓶
- RFID之M1卡数据分析
- ATM机类结构设计(一)
- 两个字符串拼接(不用strcat函数)
- 未能移除您的icloud_如何为您的iCloud电子邮件地址创建别名
- mercurial hg best pratice
- 云平台(cloud platforms)
- 5阶无向完全图_第8章 几种典型图(5}.ppt
热门文章
- windows安装Matplotlib
- Python分布式爬虫-elasticsearch搭建搜索引擎
- 二叉树的前序遍历,中序遍历,后序遍历学习 (原)
- BZOJ2653 middle 【主席树】【二分】*
- 黄聪:如何使用CodeSmith批量生成代码(转:http://www.cnblogs.com/huangcong/archive/2010/06/14/1758201.html)...
- 【Silverlight】Bing Maps学习系列(七):使用Bing Maps的图片系统(Tile System)
- android 常用小功能(第二版)
- 如何搭建python框架_从零开始:写一个简单的Python框架
- java进城杀不死怎么办_linux – 如何杀死永不死的进程?
- linux代码中能出现中文吗_Linux命令很熟悉,你知道它们的英文全称和中文解释吗?...