Swift教程之基本操作符

基本操作符

本章介绍Swift中的常见操作符,并介绍使用自定义操作符实现复杂运算。

<br />

术语

操作符包括一元、二元和三元运算符:

  • 一元运算符包括前缀运算符(如-a)和后缀运算符(a!)。
  • 二元运算符为中缀运算符。
  • Swift只有一个三元运算符,即条件表达式(a ? b : c)。

<br />

赋值运算符

简单赋值运算:

let b = 10
var a = 5
a = b

元组赋值运算:

let (x, y) = (1, 2)
// x 等于 1, y 等于 2

与C和Objective-C不同的是,Swift的赋值运算符不返回该值,使得赋值运算符不可在if语句中作条件判断:

if x = y {
    // 不合法,x = y不返回任何值
}

这个特性能避免在代码中将 == 写作 =

<br />

算术运算符

Swift支持加(+)、减(-)、乘(*)、除(/)四种数值运算。

与C和Object-C不同,Swift的算术运算符不允许值溢出,可选择溢出运算符(如&+b)对溢出选值。

加法运算符(+)可用在String中:

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

求余运算符

一元减号运算符

let three = 3
let minusThree = -three
let plusThree = -minusThree

一元加法运算符

当和一元减法运算符一起使用时,可让代码更加对称。

复合赋值运算符

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

注意

符合赋值运算符不返回任何值

<br />

比较运算符

标准C比较运算符

  • a == b
  • a != b
  • a > b
  • a < b
  • a >= b
  • a <= b

注意

==!== 运算符用于判断两个对象是否引用同一个实例对象。

比较运算符常用于条件语句:

let name = "world"
if name == "world" {
    print("hello, world")
} else {
    print("I'm sorry \(name), but I don't recognize you")
}
// Prints "hello, world", because name is indeed equal to "world".

逻辑运算符可用于对元组类型的比较,从左到右依次比较:

(1, "zebra") < (2, "apple")   // true because 1 is less than 2; "zebra" and "apple" are not compared
(3, "apple") < (3, "bird")    // true because 3 is equal to 3, and "apple" is less than "bird"
(4, "dog") == (4, "dog")      // true because 4 is equal to 4, and "dog" is equal to "dog"

只有当元组的每个元素能够应用该操作符时才能进行比较:

("blue", -1) < ("purple", 1)        // OK, evaluates to true
("blue", false) < ("purple", true)  // Error because < can't compare Boolean values

注意

Swift标准库只能对少于7个元素的元组使用比较运算符,否则必须自己实现比较运算符。

<br />

三元条件运算符

三元条件运算符(question ? answer1 : answer2)是以下代码的缩写:

if question {
    answer1
} else {
    answer2
}

三元条件运算符应谨慎使用,避免三元条件运算符的嵌套使用,这样会使代码可读性降低。

<br />

nil合并运算符

nil合并运算符(a ?? b)表明若可选类型a不为nil,则返回a的强制解包值,否则返回默认值b。

nil合并运算符是以下代码的缩写:

a != nil ? a! : b

nil合并运算符用于给可选类型设定默认值:

let defaultColorName = "red"
var userDefinedColorName: String?   // 默认为 nil
 
var colorNameToUse = userDefinedColorName ?? defaultColorName

<br />

范围运算符

范围运算符是范围值的缩写形式。

闭合范围运算符

闭合范围运算符(a...b)表示包含a和b的从a到b的一系列整数值。

闭合范围运算符常用于迭代:

for index in 1...5 {
    print("\(index)")
}

半开范围运算符

半开范围运算符(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])")
}

单边范围运算符

单边范围忽略了双边范围的某一边,常用于数组元素遍历,如:

for name in names[2...] {
    print(name)
}
 
for name in names[...2] {
    print(name)
}

单边范围运算符也与半开范围形式,但是该单边必须在末尾,因为迭代起始不清楚,如:

for name in names[..<2] {
    print(name)
}

单边范围也可用于判断是否包含特定值:

let range = ...5
range.contains(7)   // false
range.contains(4)   // true
range.contains(-1)  // true

<br />

逻辑运算符

逻辑运算符与布尔值一起使用,有三种基本逻辑运算符:

  • 逻辑非( !a )
  • 逻辑与( a && b )
  • 逻辑或( a || b )

逻辑非运算符

逻辑非运算符反转布尔值:

let allowedEntry = false
if !allowedEntry {
    print("ACCESS DENIED")
}

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

逻辑与运算符

逻辑与运算符与C语言相同,也会出现短路现象。

let enteredDoorCode = true
let passedRetinaScan = false
if enteredDoorCode && passedRetinaScan {
    print("Welcome!")
} else {
    print("ACCESS DENIED")
}

逻辑或运算符

逻辑或运算符也有短路现象。

let hasDoorKey = false
let knowsOverridePassword = true
if hasDoorKey || knowsOverridePassword {
    print("Welcome!")
} else {
    print("ACCESS DENIED")
}

组合逻辑运算符

使用组合逻辑运算符构建复杂的逻辑表达式:

if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {
    print("Welcome!")
} else {
    print("ACCESS DENIED")
}

注意

逻辑与和逻辑与是左结合运算符,组合逻辑表达式会首先评估最左边的子表达式。

显式括号

在组合逻辑运算符中适当使用括号可提供代码的可读性并保持意图清晰。

if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword {
    print("Welcome!")
} else {
    print("ACCESS DENIED")
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容