基本操作符

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

术语

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

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

赋值运算符

简单赋值运算:

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不返回任何值
}

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

算术运算符

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

注意

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

比较运算符

标准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个元素的元组使用比较运算符,否则必须自己实现比较运算符。

三元条件运算符

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

if question {answer1
} else {answer2
}

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

nil合并运算符

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

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

a != nil ? a! : b

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

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

范围运算符

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

闭合范围运算符

闭合范围运算符(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

逻辑运算符

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

  • 逻辑非( !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")
}

转载于:https://www.cnblogs.com/keqipu/p/7616777.html

Swift教程之基本操作符相关推荐

  1. 【note】the swift programming language Swift教程笔记

    // ------–Swift教程--------------- 要么变量初始化让其可以推断出类型,要么直接指定一个类型,不可以写: var a 这样的语句,会让系统不明白a到底是什么类型的变量 允许 ...

  2. Swift教程Swift语言快速入门(内部资料)

    Swift语言快速入门(内部资料) 试读下载地址:http://pan.baidu.com/s/1eQCGRHw 前言Swift教程Swift语言快速入门(内部资料)Swift教程Swift语言快速入 ...

  3. iOS 8 Metal Swift教程 :开始学习

    (via:泰然网,译者:Hero Kingsley) 学习使用苹果GPU加速3D绘图的新API:Metal! 在iOS 8里,苹果发布了一个新的接口叫做Metal,它是一个支持GPU加速3D绘图的AP ...

  4. 中文版 Apple 官方 Swift 教程《The Swift Programming Language》

    简介 欢迎使用 Swift 关于 Swift 版本兼容性 Swift 初见 Swift 版本历史记录 Swift 教程 基础部分 基本运算符 字符串和字符 集合类型 控制流 函数 闭包 枚举 类和结构 ...

  5. 游戏中的三角学——Sprite Kit 和 Swift 教程(1)

    原文链接 : Trigonometry for Games – Sprite Kit and Swift Tutorial: Part 1/2 原文作者 : Nick Lockwood 译文出自 : ...

  6. Swift教程-视频拍摄教程

    原文链接:Take Video Tutorial in iOS8 with Swift 原文日期:2015/07/09 译者:lfb_CD 校对:numbbbbb 定稿:shanks 苹果公司提供了U ...

  7. HealthKit Swift 教程: workout

    原文:HealthKit Tutorial with Swift: Workouts 作者:Ted Bendixson 译者:kmyhy 更新说明:本教程由 Ted Bendixson 升级至 Swi ...

  8. 游戏中的三角学——Sprite Kit 和 Swift 教程(2)

    原文链接 : Trigonometry for Games – Sprite Kit and Swift Tutorial: Part 2/2 原文作者 : Nick Lockwood 译文出自 : ...

  9. SwiftUI,Swift 教程推荐(免费为主)

    楼主之前写的是python,因团队较小,工作需要,开始写swift,和python等编程语言比起来,swift好的教程是真的少,而且很多需要收费,下面推荐一些较好的教程,博主们有好的教程也可以私信楼主 ...

最新文章

  1. Redis 高可用篇:你管这叫主从架构数据同步原理?
  2. ScrollView分栏视图分析
  3. 成功解决Instructions for updating:  Use `tf.global_variables_initializer` instead.
  4. 张陈斌计算机控制工程,计算机控制讲稿--4.pdf
  5. 如何使用Dependabot保持环境最新
  6. SpringBoot--springboot启动类和controller的配置
  7. Win-MASM64汇编语言-$/取当前行代码的地址
  8. ArrayList<object> list 转org.json.JSONArray
  9. 计算机硬件基础电路参数测量,硬件电路设计基础知识.doc
  10. EasyUI:Layout 布局
  11. Fedora 14 下成功驱动BCM4312的步骤
  12. abaqus更改计算机名,ABAQUS 2016 安装教程
  13. EasyNLP玩转文本摘要(新闻标题)生成
  14. 2011中国国际金融展隆重举行
  15. 深度优先遍历算法-02最大岛屿问题
  16. Postman接口测试工具超详细-接口关联-接口自动化测试教程实例
  17. [免费专栏] Android安全之绕过直连、HOST校验、系统证书校验、代理检测、双向认证抓HTTPS数据
  18. win10专业版插耳机没声音的解决方案。
  19. ZBrush?中Nudge推动笔刷
  20. Ubuntu 20.04配置ORB-SLAM2和ORB-SLAM3运行环境+ROS实时运行ORB-SLAM+Gazebo仿真运行ORB-SLAM2+各种相关库的安装

热门文章

  1. javascript Uncaught ReferenceError: 方法名 is not defined
  2. Assembly.Load,Assembly.LoadFile 与 Assembly.LoadFrom
  3. Js自定义提示框(dialog版本)
  4. 关于arguments,caller以及匿名函数调用的问题
  5. Ajax(2)--Ajax核心工作机制 你忘记了吗?
  6. xml+javascript实现简单图片轮换
  7. tcmalloc编译
  8. k8s核心技术-Pod(调度策略)_影响Pod调度(资源限制和节点选择器)---K8S_Google工作笔记0025
  9. FPGA工作笔记0001---FPGA简介-强大的逻辑资源和恐怖的IO并行处理能力
  10. 数据库工作笔记009---linux 导入导出postgresql数据库