下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

swift语言的算法基础

作者:课课家教育     来源: http://www.kokojia.com点击数:895发布时间: 2016-07-27 09:00:02

标签: swiftC语言Objective-C

  苹果公司在WWDC2014上发布了一项全新开发的语言,它的语法比Objective C更为简洁的、兼容Objective C的语言,这就是Swift。某种意义上Swift作为苹果的新商业战略,将吸引更多的开发者入门,从而强大appstore和macstore本来就已经实力雄厚的应用数量基础。本文主要为大家介绍一下赋值运算符、数学运算符、取余运算符、浮点余数计算、自增和自减运算符等。

  运算符是一种特定的符号或表达式,用来检验、修改或合并变量。例如,用求和运算符+可以对两个数字进行求和(如leti=1+2);稍微复杂一点的例子有逻辑与操作符&&(如ifenteredDoorCode&&passedRetinaScan),自增长运算符++i(这是i=i+1的简写方式)。

  Swift支持C标准库中的大多数运算符,并提升了各自的兼容性,从而可以排除常见的编码错误。赋值操作符(=)不会返回一个值,这样可以防止你因粗心将赋值运算符(=)写成(==)而引起错误。算术符(+、-、*、/、%等)会检查与驳回值溢出,这样可以避免值类型的数据在超过值类型所允许的存储范围时,出现意外的数据。你可以选择使用Swift所提供的值溢出运算符进行量化溢出的行为。

  与C语言不同,Swift允许你对浮点数执行取余运算。同时,Swift提供两个范围的运算符(a..b和a…b),作为表示一个数值范围的简写方式,C语言不支持这一点。

  下文主要描述了Swift的常见运算符。高级运算符覆盖了Swift的高级操作符,并且对自定义操作符,对自定义类型操作符的实现进行了描述。

  一、术语

  操作符都是一元、二元或三元:

  一元操作符操作单个对象(如-a)。一元前缀操作符出现在对象前(如!b),一元后缀操作符在对象后出现(如i++)。

  二元操作符操作两个对象(如2+3),并且操作符位于两个元素中间。

  三元操作符对两个对象进行操作。与C语言一样,Swift仅支持一个三元操作符:三元条件操作符(a?b:c)。

  操作符所影响的值被称为操作数。表达式1+2中,符号+是一个二元运算符并且两个操作数分别为1和2。

  二、赋值运算符

  赋值运算符(a=b)用b的值去初始化或更新a的值:

swift语言的算法基础_swift_C语言_课课家

  假如右边赋值的数据为多个数据的元组,它的元素可以是一次性赋给的多个常量或变量:

赋值

  与C语言及Objective-C不同,Swift中赋值运算符并不将自身返回一个值。下面的代码是不合法的:

swift赋值运算

  此特性可以避免你因粗心将赋值运算符(==)写成(=)而引起的错误。因为写成ifx=y是无效的。

  三、数学运算符

  Swift支持所有数字类型的四个标注运算符:

  加法(+)*减法(-)

  乘法(*)

  除法(/)

  例如:

swift运算符

  默认情况下,Swift的算术运算符不允许值溢出,这一点,swift与C语言和Objective-C也不同。你可以通过Swift的溢出运算符来选择值的溢出情况(例如a&+b)。

  加法运算符对字符串连接也一样适用,例如:

swift 代码

  两个字符,或者一个字符一个字符串,能组合成一个新的字符串:

swift

  四、取余运算符

  取余运算符(a%b)计算出a是b的几倍然后返回被留下的值(余数)。

  注:余数运算符(%)亦称是其他语言的一个取模运算符。然而,其在Swift里意味着如果对负数操作,严格的说,得到的是余数而不是模数。

  来看看余数运算符如何工作。要计算9%4,首先求出9是4的几倍。

  9除以2,分为两个4,余数为1(显示在橙色区域):

swift 取余运算符

  在Swift中,这个将被写成:

取余运算符

  确定a%b的答案,运算符%计算下列等式并且返回余数作为其输出:

swift运算

  somemultiplier表示a里面能包含b的最多倍数。

  将9和4插入到公式:

swift 插入公式

  同一个方法是应用的,当计算a时的一个负值的余数:

swift运算法则

  将-9和4插入到公式:

swift运算

  产生余数值为-1。

  b为负值时,b的符号被忽略,这意味着%b和%-b的结果是一样的。

  五、浮点余数计算

  还有一点与C和Objective-C不同,Swift的余数运算符也能运用于浮点数:

浮点余数计算

  在本例中,8用2.5来分等于3,余数是0.5,因此余数为0.5。

swift浮点余数计算

  六、自增和自减运算符

  像C语言一样,Swift提供一个自增运算符(++)和自减运算符(–)作为增加或减少一个数值的一种快捷方式,增减量为1。你可以对任何整数或浮点类型的变量使用这些运算符。

自增运算符

  每当你使用++i,i的值增加1,本质上++i可以看做是i=i+1,同样地,–i也可以看成是i=i-1。

  ++和–符号可以使用作为前缀算符或作为后缀运算符。++i和i++是两个有效的方式给i的值增加1,同样,–i和i–亦是。

  注意这些运算符修改i并且返回值。如果你只想要增加或减值i,你可以忽略返回值。但是,如果你使用返回值,根据下列规则将是根据你是否使用了运算符的前缀或后缀版本,它:

  如果运算符在变量之前被写,它在返回其值之前增加变量。

  如果运算符在变量之后被写,它在返回其值之后增加变量。

  例如:

  vara=0

  letb=++a

  //aandbarenowbothequalto1

  letc=a++

  //aisnowequalto2,butchasbeensettothepre-incrementvalueof1

  在上面的例子中,letb=++a中a在返回其值之前增加,这就是为什么a和b的新值是等于1。

  然而,letc=a++中a在返回其值之后增加,这意味着c获得a的原值1,然后a自增,a等于2。

  一般情况下建议使用++i和–i,因为他们修改i并返回值的行为符合我们的预期,除非特定工作情况下才使用i++。

  七、一元减运算符

  一个数值前加了符号-,叫作一元减运算符:

swift一元减运算符

  一元减运算符(-)直接地被加在前面,在它起作用的值之前,不用任何空白空间。

  八、一元加运算符

  一元加运算符(+)返回它起作用的值,不做任何变动:

swift一元加运算符

  实际上一元加上运算符并不执行什么,但当你也使用一元减负数的运算符时,你能使用它提供对称的正数。

  九、复合赋值操作符

  Swift提供类似C语言的复合赋值操作符,即把赋值和另一个运算合并起来。举个例子,像加法赋值运算符(+=):

复合赋值操作符

  表达式a+=2比a=a+2更精炼。加法赋值运算符能有效地把加法和赋值组合到一个运算,同时执行这两个任务。

  要注意的是,复合赋值操作符不返回值。例如,你不能写成letb=+=2,这种行为与上面提到的递增和递减运算符不同。

  十、比较运算符

  Swift支持所有标准c的比较运算符:

  等于(a==b)

  不等于(a!=b)

  大于(a>b)

  小于(a<b)

  大于等于(a>=b)

  小于等于(a<=b)

  注:Swift提供两个恒等运算符(===and!==),用它来测试两个对象引用是否来自于同一个对象实例。每个比较操作符返回一个Bool值来表示语句是否为真:

恒等运算符

  比较操作符通常用在条件语句,如if语句:

条件语句

  十一、三元条件运算符

  三元条件运算符是一种特殊的运算符,有三个部分,其形式为question?answer1:answer2.这是一个用来测试两种表达式基于输入是真或是假的快捷方式。如果question?为true时,它评估answer1并返回其值;否则,它评估answer2并返回其值。三元条件运算符是下面的代码的简化:

三元条件运算符 swift

  举个例子,计算一个表行像素的高度,如果行有一个头,行高应该是50像素,比内容要高度要高。如果行没有头是20像素:

swift 三元条件运算符

  前面的例子也可以用下面的的代码:

三元条件运算符

  第一个例子使用的三元条件运算符,意味着rowHeight可以在一行代码被设置为正确的值。这比第二个示例更简洁,不需要课外的rowHeight变量,因为它的价值不需要在一个if语句中修改。

  三元条件运算符提供了一个高效的写法来决定执行哪个表达式。但使用三元条件运算符时要注意,其简洁性如果过度使用会使阅读代码更加困难。要避免多个实例的三元条件运算符组合成一个复合语句。

  十二、范围运算符

  Swift包含两个范围运算符,能快捷的表达一系列的值。

  1.封闭范围运算符

  封闭范围运算符(a…b)定义了一个范围,从a到b,并包括a和b的值。

  当要在一个范围内迭代所有可能的值时,范围运算符是非常有用的,例如for-in循环:

封闭范围运算符

  2.半封闭的区域运算符

  半封闭的区域运算符(a..b)定义了从a到b的范围,但不包括b。它被认为是半封闭的,因为它包含第一个值,而不包含最终值。

  半封闭的范围使用明确,当你使用从零开始的列表,如数组,它是有用的数到(但不包括)列表的长度:

半封闭的区域运算符

  注意:该数组包含四个项目,但0..数只数到3(数组中的最后一个项目的索引),因为它是一个半封闭的范围。

  十三、逻辑运算符

  逻辑运算符修改或结合布尔逻辑值true和false。Swift支持这三个标准逻辑运算符基于c语言:

  LogicalNOT(!a)

  LogicalAND(a&&b)

  LogicalOR(a||b)

  十四、逻辑非运算符

  逻辑非运算符(!a)转化一个Bollean值,true变成false,false变成true。

  逻辑操作符是一个前缀操作符,并立即出现在它修饰的值之前,没有任何空白,它被解读为”不是”,见下面的例子:

  letallowedEntry=false

  if!allowedEntry{

  println("Access DENIED")

  }

  //prints"ACCESSDENIED"

  这句话if!allowedEntry能理解为“ifnotallowedEntry.”只执行后续的行,如果“notallowedEntry”是true;那就是说ifallowedEntry是false.

  此例中,精心挑选的布尔常量和变量名可以帮助保持代码的可读性和简洁,同时避免双重否定或混乱的逻辑语句。

  十五、逻辑与运算符

  逻辑与运算符:在(A&&B)创建的表达式中,A和B两个值必须同时为true时表达式才正确。

  若A或B有任一值是false时,表示逻辑与算符不成立,必须两者同时为true时才成立。实际上,只要第一个值是false,第二个值就不会再进行判断了,因为必须同时两个值都为true,如果有一方为false,则不用继续判断了。这被称作短路条件。

  以下这个例子判断两个Bool类型的值,并只有当这两个值都为true时,才会输出:Welcome。失败则输出”ACCESSDENIED”:

逻辑与运算符

  十六、逻辑或运算符

  表达式(a||b)运算符中、只要a或者b有一个为true,表达式就成立。

  与上面的逻辑与运算符相似,逻辑或运算符使用短路条件判断,如果左边是true,那么右边不会被判断,因为整体结果不会改变了。

  在下面的例子中,第一个布尔值(hasDoorKey)为false,但第二个值(knows Over ride Password)为true。因为两者有一个值是true,整个表达式的计算结果也为true,正确输出:Welcome!

布尔值

  十七、复合逻辑表达式

  你可以将多个逻辑运算符复合来创建更长的复合表达式:

逻辑运算复合

  相比于之前两个单独分开的运算符,本次通过多重嵌套,将上面的&&、||运算符组合成一个较长的复合表达式。看起来有点饶人,本质还是两两相比较,可以简单地看成A&&B||C||D,从左往右根据运算符优先级进行判断,注意区分开&&、||,要牢记运算逻辑&&需要两者都为true,||则只需要一方为true则运算符正确,即可解析整个复合表达式,透过现象看本质。

  添加括号使逻辑意图更明确

  复合表达式中,添加()可使逻辑意图更明确。如上面的例子,可以在第一部分上添加括号,使意义更明确。

swift符合表达式

  在复合逻辑表达式中,可以使用括号明确地表示我们需要将几个值放在一个单独的逻辑运算中去判断得出结果,最后根据()内的结果去与后面的值进行判断。例如上面的例子,像小学的四则运算一样,如果没有括号(),我们肯定会按照运算符的优先级去判断,正因为有了括号、我们需要先运算其中的逻辑运算符得到它们的值,使用括号()在符合逻辑表达式中可以更明确你的意图。

  Swift从Pythonjava Script中学到了许多东西,从而让Swift更为易读,或者说更为“口语化”。然而,对这类语法更为简洁的语言,许多人会质疑其运行效率。对此,苹果以对复杂对象的排序为例,指出Swift在许多方面比Objective C的性能更好。

赞(0)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程