一、简介

  运算符是检查、改变、合并值的特殊符号或者短语。在本篇文章中只介绍基本运算符,Swift中包含的高级运算符(比如溢出运算符)不在其中。Swift中的运算符和OC中的运算法还是有比较大的区别的,Swift语言这样做的目的是减少常规编码错误。

二、术语

运算符分为一元、二元和三元运算符。

一元运算符分为前置运算符和后置运算符。

受运算符影响的值叫操作数,在表达式1 + 2中,加号(+)是二元运算符,它的两个操作数是值1和值2。

三、Swift和OC的对比

Swift OC 附加说明
= = Swift与OC不同,Swift的赋值操作不返回任何值
+、-、*、/、-=、+= +、-、*、/、-=、+= Swift中的+可以拼接String
==、!=、>、<、>=、<= ==、!=、>、<、>=、<= 比较运算符可以作用于Swift中的元组
问题 ? 答案1 : 答案2 问题 ? 答案1 : 答案2 特殊情况下的三目运算符可以用空合运算符简化
?? Swift中的空合运算符是为optional类型所产生的
a...b、a..<b OC中并没有对应的区间运算符
!、&&、|| !、&&、|| 与OC使用一致

四、Swift基本运算符的介绍

1、赋值运算符(=)

·这里只需要注意的是Swift与C语言和OC不同,Swift的赋值运算符操作并不返回任何值。

说明:这个特性使得你无法把(==)错写成(=),由于if x = y是错误代码,Swift能帮你避免此类错误的发生。

2、算术运算符(+)

·Swift中所有的数值类型都支持基本的四则算术运算符:加法(+)、减法(-)、乘法(*)、除法(/)

·Swift中的加法运算符还可以用于String的拼接,OC中没有这个特性

·Swift默认情况下不允许在数值运算中出现溢出情况(当然在高级运算符中有溢出运算符来实现溢出运算)。但是OC中是没有这个检查的

3、求余运算符(%)

·求余运算和取模运算是不一样的结果。严格的定义请根据数学上的定义区分

例如计算:-7 Mod 4

那么:a = -7;b = 4;

第一步:求整数商c,如果进行求模运算c = -2(向负无穷方向舍入),求余c = -1(向0方向舍入)

第二步:因为c的值不同,求模时r = 1,求余时r = -3

·为了比较好记忆求余运算的方式,使用a = (b * 倍数) + 余数,当b的最大多少倍刚好能够容入a时,此时的余数就是求余运算的结果

9 % 4

//9 = (4 * 倍数)+ 余数,当倍数等于2时,8刚好容入9,此时余数为1

-9 % 4

//-9 = (4 * 倍数) +余数,当倍数等于-2时,-8刚好容入-9,此时余数为-1

9 % -4

//9 = (-4 *倍数)+余数,当倍数等于-2时,8刚好容入9,此时余数为1

4、一元负号运算符(-)

·一元运算符与操作数之间不要有空格

5、一元正号运算符(+)

·一元运算符与操作数之间不要有空格

6、组合赋值运算符(+=、-=)

·先后完成两个运算任务

7、比较运算符(==、!=、>、<、>=、<=)

·因为Swift中增加了元组数据类型,元组也可以使用比较运算符,采用的是从左到右依次比较,当左边的比较相等才进行右边的比较,以此类推。但是Swift标准库只能比较7个以内元素的元组比较函数。如果元组元素超过7个时,需要自己实现比较运算符。

·Int和String等类型可以比较,Bool类型不能比较。

8、三目运算符(问题 ? 答案1 : 答案2)

·跟OC中的使用一致

9、空合运算符(??)

·空合运算符是根据Swift中出现的可选类型而出现的在特殊情况下对三目运算符的一种简写。

·空合运算符(a ?? b)将对可选类型进行空判断,如果a包含一个值就进行解封,否则就返回一个默认值b。表达式a必须是Optional类型。默认值b的类型必须要和a存储值的类型保存一致。

let defaultColorName = "red"

var userDefinedColorName: String?

var colorNameToUse = a != nil ? userDefinedColorName : defaultColorName

等价于

var colorNameToUse = userDefinedColorName ?? defaultColorName

10、区间运算符(a...b、a..<b)

·闭区间运算符(a...b)定义一个包含从a到b(包括a和b)的所有值的区间。

·半开区间运算符(a..<b)定义一个从a到b但不包括b的区间。

·使用场景经常在for in循环中出现

let names = ["Anna", "Alex", "Brain", "Jack"]

let count = names.count

for i in 0..<count {

  //

}

11、逻辑运算符(!、&&、||)

·逻辑非 、逻辑与、逻辑或,三个逻辑运算符跟OC中的使用保持一致

·不管是Swift还是OC,逻辑操作符&&和||都是在左结合的,这意味着拥有多元逻辑操作符的符合表达式优先计算最左边的子表达式。当然,对于复杂表达式,使用括号来明确优先级更加容易读懂。

Swift3.0-基本运算符的更多相关文章

  1. Swift3.0变化分享

    Swift 3.0 做出的改变很大,在这篇文章中,我将尽我所能,利用代码样例给大家解释Swift 3.0最重要(要命)的改变,希望大家能够做好升级Swift 3.0 的准备.Swift 3.0的改变不 ...

  2. swift3.0变化总结

    Swift 3.0 做出的改变很大,在这篇文章中,我将尽我所能,利用代码样例给大家解释Swift 3.0最重要(要命)的改变,希望大家能够做好升级Swift 3.0 的准备.Swift 3.0的改变不 ...

  3. Swift2.3 --> Swift3.0 的变化

    Swift3.0语法变化 首先和大家分享一下学习新语法的技巧: 用Xcode8打开自己的Swift2.3的项目,选择Edit->Convert->To Current Swift Synt ...

  4. Swift3.0语法变化

    写在前面 首先和大家分享一下学习新语法的技巧:用Xcode8打开自己的Swift2.3的项目,选择Edit->Convert->To Current Swift Syntax- 让Xcod ...

  5. Swift3.0 更新后出现比较运算符方法

    在将项目更新到swift3.0之后,在一些controller头部会出现 比较运算符的方法 // FIXME: comparison operators with optionals were rem ...

  6. Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)

    本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...

  7. 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)

    本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...

  8. 关于for循环------swift3.0

    在程序开发当中,for循环使用的频率无疑是最高的.常用的swift循环是递增式遍历.当然各种循环,swift都能办到.但其大多采用关键字形式实现,大部分开发者更喜欢直接使用C式循环代码.在swift3 ...

  9. Swift3.0都有哪些变化

    从写第一篇Swift文章的时候到现在Swift已经从1.2发展到了今天的3.0,这期间由于Swift目前还在发展阶段并不能向下兼容,因此第一篇文章中的部分代码在当前的Xcode环境中已经无法运行.在W ...

  10. iOS开发 swift3.0中文版

    swift3.0中文版: http://pan.baidu.com/s/1nuHqrBb

随机推荐

  1. new一个对象做了哪些操作

    网上其实有很多说new关键字做了哪些操作,读过之后就忘了,这里以自己的理解做一个简单的记录. function Naji () { this.skulk = function () { return ...

  2. Innovus 对multibit 的支持

    如果在综合阶段没有做multibit merge, 或综合阶段由于缺失物理信息multibit cell merge 不合理,那就需要PR 工具做multibit merge 或split. Inno ...

  3. dbGet(二.一)hinst

    hinst hierarchical insts Parent Object bndry,group,hInstTerm,hTerm, inst,ptn,topCell,vCell Child Obj ...

  4. Linux源码编译安装nginx

    ps:一切从简 一.安装所需环境: yum -y install gcc gcc-c++ automake pcre pcre-devel zlip zlib-devel openssl openss ...

  5. HTML5地理定位(已知经纬度,计算两个坐标点之间的距离)

    事实上,地球上任意两个坐标点在地平线上的距离并不是直线,而是球面的弧线. 下面介绍如何利用正矢公式计算已知经纬度数据的两个坐标点之间的距离.半正矢公式也成为Haversine公式,它最早时航海学中的重 ...

  6. VS Code的git配置

    最近打算使用VS Code作为python的编辑器,这里记录一下VS Code中git的配置方法 因为vscode中git只是使用本地的git,所以本地必须先安装git才行. 1.git的安装 git ...

  7. 多进程manager共享

    使用manager在进程之间事项共享数据. 栗子: 主进程调用manager,创建一个字典d和一个列表l,启动十个子进程,每个子进程都向d和l中放数据 from multiprocessing imp ...

  8. vue 路由传参 以及获取参数

    1.通过query实现: <router-link :to="{ name:'home',query:{id:1} }">跳转页面</router-link> ...

  9. mysql中的数据类型长度

    “mysql中的数据类型长度是固定的 数据类型后面改的只是展示长度 没用的 int就是四个字节 2的31次方减一是最大值 所以改这个长度没用 只能改数据类型”

  10. python实现网页登录时的rsa加密流程

    对某些网站的登录包进行抓包时发现,客户端对用户名进行了加密,然后传给服务器进行校验. 使用chrome调试功能断点调试,发现网站用javascript对用户名做了rsa加密. 为了实现网站的自动登录, ...