Swift3.0学习笔记-Basic Operators(基本运算符)

            参考:

 https://developer.apple.com/library/prerelease/content/documentation/Swift/Conceptual/Swift_Programming_Language/BasicOperators.html#//apple_ref/doc/uid/TP40014097-CH6-ID60


         运算符是一种特殊的符号或短语,用于检查、修改或者组合值。举例说明,加法运算符(+)可以得到两个值之和,就像let i = 1+2 ,i等于3;逻辑与运算符(&&)判断2个布尔值是否都为真,比如entereddoorcode & passedretinascan,当entereddorrcode和passedretinascan都为true时,表达式等于true。

       Swift支持大多数标准C语言的运算符(但不支持++和--),并改进了其中一部份运算符以减少编码错误。当应该使用判断相等(==)操作符却错误的使用了赋值操作符(=)时,不会真正的进行赋值操作(说明:这跟Java/C语言都不同。稍候会详细解释)。Xcode会对算术运算符(+,-,*,/,%等)的范围进行检测,不允许值溢出,否则Xcode会提示错误;从而避免值越界时导致的未知问题。当有可能出现值溢出的情况时, 你可以使用溢出运算符(在后续章节再详细介绍)。

      Swift还提供了C语言没有的范围运算符(a..<b和a...b),用在设置区间范围的情况下。

      本文介绍了Swift常用的运算符,在后续的“高级运算符”章节会详细介绍自定义运算符(或者叫运算符重载)。


术语:

运算符可分为一元、二元或者三元运算符(跟Java/C一样)。

       一元运算符用在单个参数(例如 -a)。一元运算符可当作参数的前缀(例如!b)或者当作参数的后缀(例如c!),由一个参数和一个运算符组成。备注:在Java/C没有类似c!的语法, 在Swift中用在Optional类型取值。

       二元运算符用在两个参数之间(例如2+3),由2个参数和一个运算符组成。

       三元运算符用在3个参数之间,跟C语言一样, Swifit只有一个三元运算符,语法是a ? b:c。 

运算符影响的是结果值,例如表达式1+2,+是二元运算符,它操作的2个数是1和2。


赋值运算符(+)

当赋值运算符用在表达式a=b时, 这句代码的含义是给变量a赋初值b, 或更新变量a的值为b。

  1. let b = 10
    var a = 5
    a = b
    
    //变量a的值是10

如果等号的右边是具有多个值的元组,它的元素可以被分解成多个常量或变量:

  1. let  (x,y) = (1,2)

  2. // 变量x是Int型,值为1; 变量y是Int型,值为2
  3. 说明:在Java/C语言中没有类似语法。


跟C/Java的赋值运算符(=)不同的是, Swift在if语句中使用赋值运算符,该句代码无效, Xcode会提示错误。


var x = 1, y =1
if x ==y {
    // true, do something
} else {
    // false
}

算法运算符:

Swift对所有数字类型支持4种计算运算符,加(+)、减(-)、乘(*)、除(/)。

1 + 2 // 等于 3
5 - 3 // 等于 2
2 * 3 // 等于 6
10.0 / 2.5 // 等于 4.0

  1. 跟C/Object-C不同的是,Swift不允许出现值溢出的情况; 如果要处理值溢出的情况, Swift提供了溢出运算符, 例如a &+ b, 在后续章节会详细介绍。

赋值运算符还可用在字符串类型中间,功能是字符串拼接。

"hello, " + "world" // 等于 "hello, world"


  1. 取余运算符%

   跟Java/C/OC功能、用法一样, %会得到整除后剩下的数值。语法是 a%b, 例如9%4等于1。


减号运算符-

  跟Java/C/OC功能、用法一样, -会得到两个参数的差值,或者对一个值取负数。

let three =3
let minusThree = -three   // minusThree 等于 -3
let plusThree = -minusThree  // plusThree 等于 3, 即负负为正

 注意:取负数时减号在参数前面, 中间没有空格。


加法运算符+

  跟Java/C/OC功能、用法一样,+会得到两个参数的和, 单独写在变量前时无任何作用(区别于-)。

  1. let  minusSix =-6
    let  alsoMinusSix = +minusSix   // alsoMinusSix 仍然是 -6


复合赋值运算符+=

 跟Java/C/OC功能、用法一样, 复合赋值运算符会先将两边参数求和后赋值给左边参数。

var a =1
a  += 2  // a 等于 3

  1. 表达式a += 2等同于a = a + 2, 一个运算符执行了2个操作, 即求和和赋值。


比较运算符:

Swift只有所有的C语言比较运算符

是否相同 (a == b)
是否不同 (a != b)
大于  (a > b)
小于  (a < b)
大于等于  (a >= b)
小于等于 (a <= b)
1 == 1 // true 
2 != 1 // true 
2 > 1 // true 
1 < 2 // true
1 >= 1 // true 
2 <= 1 // false 

比较运算符常常用在逻辑分支判断语句, 例如if后面。

// 输出 "hello, world", name是String类型, 判断是否相同可以使用==。 而在Java里要使用String的equals方法, 如果是在Java里name == "world"的含义是判断参数name指向的地址跟“world”是否相同。
let name ="world"
if name =="world" { //注意:字符串判断是否相同可以使用==
     print("hello, world")
} else {
     print("I'm sorry \(name), but I don't recognize you")
}


 上述操作符还可以用在相同参数数量的元组, 比较元组中的各个值, 按照由前向后的顺序比较, 跟逻辑与的逻辑类似。

(1,"zebra") < (2,"apple")// true 因为1小于2; "zebra" 和 "apple" 不需要比较了
(3,"apple") < (3,"bird")// true 因为3等于3, 所以要比较第2个值,"apple"小于"bird", 按照字母顺序。
(4,"dog") == (4,"dog")// true 因为4等于4, 而且第2个值 "dog"与"dog"相等

无合并运算符??   (Swift独有)

  var colorNameToUse =userDefinedColorName ?? defaultColorName
print("colorNameToUse:"+colorNameToUse) //输出 "colorNameToUse:red"
// userDefinedColorName等于nil,所以会将defaultColorName的值赋给colorNameToUse,即"red"
userDefinedColorName = "blue"
var colorNameToUseExt = userDefinedColorName ??defaultColorName
print("colorNameToUseExt:"+colorNameToUseExt) //输出 "colorNameToUseExt:blue"

注意: 无合并运算符只能使用在可选Optional参数类型后面!!

无合并运算符(a ?? b)获取Optional类型参数a的值,如果参数a有值则取值给参数a(相当于a = a!);  如果参数a没值,则赋值b给a。

      a ?? b 等同于 a != nil ? a! : b

  1. // userDefinedColorName有值blue, 所以会取出useDefinedColorName的值赋给colorNameToUseExt, 即"blue"


 区间运算符 a...b

范围运算符(a...b) 定义了从a到b的范围[a,b], 包含值a和b, a必须小于b。 区间运算符可以用在你想遍历所有值时,例如for-in循环。

for index in1...5 { //相当于 1 <= index && index <= 5
print("\(index) times 5 is \(index *5)")
}
// 1 times 5 is 5
// 2 times 5 is 10
// 3 times 5 is 15
// 4 times 5 is 20
// 5 times 5 is 25

 半开区间运算符 a ..< b ( 相当于[a,b) ) 范围运算符a..<b, 定义了从a到b的区间[a,b), 包含值a但不包括b。 a不一定小于b, 当a和b想等时,运算符返回空。
let names = ["Anna","Alex","Brian","Jack"]
let count =names.count
for i in 0..<count {
print("Person\(i +1) is called\(names[i])")
}

// Person 1 is called Anna
// Person 2 is called Alex
// Person 3 is called Brian
// Person 4 is called Jack

for i in  0..<0 {
    print("Person\(i +1) is called \(names[i])")
}
//无输出


单边操作符: 即只有一个数字, 另一边是不限制。 PS: 注意上标越界。

let names = ["1", "2", "3", "4", "5"]
for name in names[..<3] {
    print(name)   // 1 2 3
}
for name in names[...3] {
    print(name)  //1 2 3 4
}
for name in names[2...] {
    print(name)  //3 4 5
}

let range = ...5   //单边区间
range.contains(5)  //true
range.contains(1)  //true
range.contains(6)  //false

逻辑运算符: 跟Java/C/OC一样

  • 取反 (!a)

  • 逻辑与 (a && b)

  • 逻辑或  (a || b)

 说明: 因为跟其它语言完全一样, 就不解释了。


==和===的区别:
== 是比较值
=== 是比较类型和值

小结:  Swift新增 ?? 和 ? 运算符, 用来处理参数没赋初值的情况;新增区间...和..<区间操作符, 提高代码可读性。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值