Swift 学习- 03 -- 基本运算符
// 运算符是检查,改变,合并值的特殊符号或短语,
// swift 支持大部分标准的 C语言的运算符, 且改进许多特性来减少常规编码错误.
/*
如: 赋值符 (=) 不返回值, 以防止把想要判断相等运算符 (==) 的地方写成 赋值符 导致的错误. 算数运算符 (+, -, * , / , %) 等 都会检测并不允许值溢出, 以此来避免保存变量是由于变量变大或小于其类型所能承载的范围导致的异常结果, 当然允许你使用 swift 的溢出运算符来实现溢出.
swift 还提供 C语言没有的表达两数之间的值的区间运算符 (a..<b 和 a...b), 这方便我们表达一个区间内的数值
*/
// 术语
/*
运算符分为, 一元. 二元 和 三元 运算符:
1. 一元运算符对单一操作对象操作 (如 -a). 一元运算符分前置运算符和后置运算符, 前置运算符需要紧跟在操作对象之前 (如 !b) , 后置运算符需要紧跟操作对象之后 (如: c!)
2. 二元运算符操作两个操作对象 (如: 2 + 3), 是中置的, 因为他们出现在两个操作对象之间
3. 三元运算符操作三个操作对象 和 C语言一样, swift 只有一个三元运算符,就是三目运算符 (a ? b : c)
*/
// 赋值运算符 (a = b), 表示用 b 的值来初始化或更新 a 的值
// 如果赋值的右边是一个多元组, 他的与元素可以马上被你分解为多个常量或者变量
// 与C语言 和 OC 不同, swift 的赋值操作并返回任何值, 所以一下代码是错误的
/*
if x = y {
// 此句错误,因为 x = y 并不返回任何值
}
这个特性使你无法把 (==) 写成 (=) .swift 会帮你鼻片此类错误
*/
// 算数运算符
// swift 中的所有数值都支持基本的四则算数运算符
// 与C语言和 OC 语言不同的是 ,swift 默认情况下不允许在数值运算中出现一处的情况. 但是你可以使用swift 的溢出运算符来实现溢出运算 (如 : a &+ b)
// 加法的运算符也可以用于 String 的拼接 如: "Hello" + "World"
// 求余运算符
// 求余运算符 (a % b) 是计算 b 的多少倍刚刚好可以容入 a , 返回多出来的部分 余数)
// 注意:
// 求余运算符 (%) 在其他语言也叫做 '取模运算符' , 然而严格的来说, 我们看改运算符对负数的操作结果, [求余]更好
// 在对负数 b 求余时候, b 的符号会被忽略, 这意味着 a % b 和 a % -b 的结果是相同的
// 一元负号运算符 (-) 写在操作数之前, 中间没有空格
// 组合赋值运算符
// 组合运算符同C语言的组合运算符一样 ,但是没有返回值 let b = a += 2 这样写是错误的
// 比较运算符
// 所有标准的C语言的比较运算符都可以在 swift 中使用
/*
等于 (a == b)
不等于 (a != b)
大于 (a > b)
小于 (a < b)
大于等于 (a >= b)
小于等于 (a <= b)
注意:
swift 也提供恒等于(===) 和 不恒等于 (!==) 这两个比较来判断两个对象是否引用于同一个对象实例
每个比较运算符都返回另一个标识表达式是否成立的布尔值
1 == 1 // true, 因为 1 等于 1
2 != 1 // true, 因为 2 不等于 1
2 > 1 // true, 因为 2 大于 1
1 < 2 // true, 因为 1 小于2
1 >= 1 // true, 因为 1 大于等于 1
2 <= 1 // false, 因为 2 并不小于等于 1
比较运算符多用于条件语句
*/
// 当元组中的值可以比较时, 你也可以使用这些运算符来比较他们的大小, 例如, 因为 Int 和 String 类型的值可以比较, 所以类型为 (Int, String) 的元组也可以比较大小, 相反 , Bool 不能比较, 也意味着存在有 Bool 的元组不能比较
// 比较元组的大小按照从左到右, 逐值比较的方式,直到发现两个值不等时候停止, 如果所有的值都相等那么这一对元组我们认为他们是相等的
// 注意:
// swift 标准库只能比较七个以内元素的元组比较函数, 如果你的元组元素超过了七个元素个数,需要自己实现比较运算符
// 三目运算符
/*
三目运算符的特殊在于它是有三个操作数的运算符, 他的形式是 问题? 答案1 : 答案2 . 他简洁地表达根据问题 成立于否做出二选一的操作 , 如果问题 成立, 返回答案1 , 反之 返回 答案2 的结果
*/
// 空合运算符
// 空合运算符 (a ?? b) 将对可选类型 a 进行是否为空判断, 如果 a 包含一个值就进行解封, 否则就返回一个默认的值 b , 表达式 a 必须是可选类型(optional), 默认值 b 必须要和 a 存储值的类型保持一致
// 空合运算符是对一下代码的简短表达方法
// a != nil ? a! : b
// 上述代码使用了三目运算符. 当可选类型 a 的值不为空时, 进行强制解封 (a!) , 访问 a 的值, 反之返回默认值 b 的值, 无疑空合运算符提供了一种更为优雅的方式去封装条件判断和解封两种行为, 显得简洁以及更具有可读性
// 注意:
// 如果 a 为非空值 (non-nil) ,那么 b 将不会被计算, 这就是所谓的短路求值
// 例如
let defaultColorName = "red"
var userDefinedColorName: String? //默认值为 nil
var colorNameToUse = userDefinedColorName ?? defaultColorName
// userDefinedColorName 的值为空,所以 colorNameToUse 的值为 "red"
// 另一种情况,分配一个非空值(non-nil)给 userDefinedColorName,再次执行空合运算,运算结果为封包在 userDefinedColorName 中的值,而非默认值。
userDefinedColorName = "green"
colorNameToUse = userDefinedColorName ?? defaultColorName
// userDefinedColorName 非空,因此 colorNameToUse 的值为 "green"
// 区间运算符 (Range Operators)
// Swift 提供了两个方便表达一个区间的值的区间运算符
// 闭区间运算符
// 闭区间运算符 (a...b) 定义一个包含从 a 到 b (包括 a 和 b )的所有值的区间, a 的值不能超过 b
// 半开区间运算符
// 半开区间运算符 (a..<b)定义一个 从 a 到 b 但不包括 b 的区间
// 之所以称为半开区间 , 是因为该区间包含第一个值而不包含最后的值
// 半开区间的实用性在于当你使用一个从 0 开始的列表(如数组时0), 非常方便的从0到列表长度
// 逻辑与运算符
// 逻辑运算符 (a && b) 表达只有 a 和 b 的值都为 true 时, z整个表达式的值才会是 true, 只要任意一个值为 false ,整个表达式的值就为 false, 事实上, 如果第一个值是 false ,那么就不需要计算第二个值的, 因为他已经不可能影响整个表达式的结果了, 这被称为短路计算
// 逻辑或运算符
// 逻辑或运算符(a || b)是一个由两个连续的 | 组成的中置运算符。它表示了两个逻辑表达式的其中一个为 true,整个表达式就为 true。
// 同逻辑与运算符类似,逻辑或也是「短路计算」的,当左端的表达式为 true 时,将不计算右边的表达式了,因为它不可能改变整个表达式的值了。
// 逻辑运算符组合计算
// 注意:
// Swift 逻辑操作符 && 和 || 是左结合的,这意味着拥有多元逻辑操作符的复合表达式优先计算最左边的子表达式。
// 使用括号来明确优先级
// 为了一个复杂的表达式更容易懂, 在适合的地方使用括号来明确优先级是很有效的, 虽然他并非是必要的,
Swift 学习- 03 -- 基本运算符的更多相关文章
- swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- Swift 学习笔记(五)
126. 协议(Protocols) 协议语法(Protocol Syntax) 属性要求(Property Requirements) 方法要求(Method Requirements) Mutat ...
- Swift学习目录
本学习基于苹果官方Swift学习材料,保留了原版90%左右的内容(一些项目开发中基本不用的知识点没有整理),并根据理解进行整理.如对原版感兴趣,可以直接单击链接阅读和学习. 第一部分 基础篇 1.基本 ...
- 033 01 Android 零基础入门 01 Java基础语法 03 Java运算符 13 运算符和表达式知识点总结
033 01 Android 零基础入门 01 Java基础语法 03 Java运算符 13 运算符和表达式知识点总结 本文知识点:运算符和表达式知识点总结 前面学习的几篇文都是运算符和表达式相关的知 ...
- 031 01 Android 零基础入门 01 Java基础语法 03 Java运算符 11 运算符的优先级
031 01 Android 零基础入门 01 Java基础语法 03 Java运算符 11 运算符的优先级 本文知识点:Java中运算符的优先级 运算符的优先级问题 前面学习了很多的运算符,如果这些 ...
- 030 01 Android 零基础入门 01 Java基础语法 03 Java运算符 10 条件运算符
030 01 Android 零基础入门 01 Java基础语法 03 Java运算符 10 条件运算符 本文知识点:Java中的条件运算符 条件运算符是Java当中唯一一个三目运算符 什么是三目运算 ...
- 023 01 Android 零基础入门 01 Java基础语法 03 Java运算符 03 算术运算符之——自增自减运算符
023 01 Android 零基础入门 01 Java基础语法 03 Java运算符 03 算术运算符之--自增自减运算符 本文知识点:Java算术运算符中的自增自减运算符 自增自减运算符 之前我们 ...
- 【swift学习笔记】二.页面转跳数据回传
上一篇我们介绍了页面转跳:[swift学习笔记]一.页面转跳的条件判断和传值 这一篇说一下如何把数据回传回父页面,如下图所示,这个例子很简单,只是把传过去的数据加上了"回传"两个字 ...
- 今天开始Swift学习
今天开始Swift学习 在此记录笔记 以备之后查阅! allenhuang
随机推荐
- 俄罗斯方块部分功能(Java)
package OO.day01; public class TetrisCell { int totalRow = 20; int totalcol = 10; //定义横宽 int row; in ...
- SSH中使用延迟加载报错Exception occurred during processing request: could not initialize proxy - no Session
17:40:17,249 ERROR DefaultDispatcherErrorHandler:42 - Exception occurred during processing request: ...
- Redis + keepalived 高可用行配置检测脚本
Redis 在生产配置中:除redis集群.哨兵模式之外:主从模式还是比较普遍的. 配置 redis 多主从:由 keepalived 做 VIP 地址漂移.可以实现redis的高可用性. keepa ...
- FlexPaper 2.3.6 远程命令执行漏洞 附Exp
影响版本:小于FlexPaper 2.3.6的所有版本 FlexPaper (https://www.flowpaper.com) 是一个开源项目,遵循GPL协议,在互联网上非常流行.它为web客户端 ...
- Codeforces Round #494 (Div. 3) D. Coins and Queries(贪心
题目链接 题目大意:给你n个物品,第iii个物品价值aia_iai,询问q次,问你能不能凑出价值为qiq_iqi的物品. 小贪心吧.从大到小找,能拿就拿就行了. #include<bits/ ...
- 网址,域名,IP,主机名的区别
域名 通常 Internet 主机域名的一般结构为:主机名.三级域名.二级域名.顶级域名(又称为一级域名). 二级域名及其以上级别的域名,统称为子域名,有多少个点就是几级域名 顶级域名分为两类 ...
- border-radius图解
自己看了理解的border-radius: 设置参数: 100*100的正方形,第一个:border-top-left-radius:100px 100px,即圆的半径为100px.圆弧与上和左bor ...
- java Object类的公共方法
1.HashCode(); 2. wait(); 3. notify(); 4.equals(); 5.getClass(); 6.toString(); 7.clone(); 8.fin ...
- Django REST Framework API Guide 05
本节大纲 1.Serializer fields 2.Serializer relations Serializer fields 1.serializer 字段定义在fields.py文件内 2.导 ...
- Django学习手册 - 前端input数据获取
view获取数据方法归纳: #请求meta数据 request.mata(...) request.method(POST,GET,PUT) #从meta里面获取数据 request.path_inf ...