Swift3.0P1 语法指南——基本操作符
关于基本操作符
Swift支持大多数的标准C操作符,也改进了其中一些能力以避免常见的编写错误。
例如,等号=并不返回一个值,以避免想用==时发生误写。运算符号(+, -, *, /, %等)会检查值的溢出并且不允许溢出,避免产生的结果超出值类型存储范围。
Swift还提供了两个范围操作符(a..<b和a...b)。
1、赋值
let b =
var a =
a = b
// a is now equal to 10
如果赋值的右边是一个多元组, 它的元素可以马上被分解多个变量或变量:
let (x, y) = (, )
// x is equal to 1, and y is equal to 2
与C语言和Objective-C不同, Swift的赋值操作并不返回任何值. 所以以下代码是错误的:
if x = y {
// this is not valid, because x = y does not return a value
}
这个特性使得你无法把==错写成=, 由于if x = y是错误代码, Swift从底层帮你避免了这些代码错误.
2、算术运算符
+ // equals 3
- // equals 2
* // equals 6
10.0 / 2.5 // equals 4.0
与C语言和Objective-C不同的是, Swift默认不允许在数值运算中出现溢出情况. 但你可以使用Swift的溢出运算符来达到你有目的的溢出, (如 a &+ b ).
加法操作 + 也用于字符串的拼接:
"hello, " + "world" // equals "hello, world"
3、取余运算符
% // equals 1
- % // equals -1
求余时, b的符号会被忽略。这意味着 a % b 和 a % -b的结果是相同的.
浮点求余:
% 2.5 // equals 0.5
注意:Swift3.0版本没有++和--运算符了。
简单的说,这两条命令没有存在的必要了,详细原因请见:Remove the ++ and -- operators
4、自增/自减运算符
i++、i--、++i、--i
与C语言中的运算符特性相同。
除非你需要使用 i++ 的特性, 不然推荐你使用 ++i 和 --i, 因为先修改后返回这样的行为更符合我们的逻辑.
4、单目负号
let three =
let minusThree = -three // minusThree equals -3
let plusThree = -minusThree // plusThree equals 3, or "minus minus three"
单目负号写在操作数之前, 中间没有空格.
5、单目正号
单目正号就直接返回操作数的值.
let minusSix = -
let alsoMinusSix = +minusSix // alsoMinusSix equals -6
6、复合赋值
同C语言。
var a =
a +=
// a is now equal to 3
注意,复合赋值并没有返回一个值,例如,不能写成 let b = a += 2
7、比较运算符
== // true, because 1 is equal to 1
!= // true, because 2 is not equal to 1
> // true, because 2 is greater than 1
< // true, because 1 is less than 2
>= // true, because 1 is greater than or equal to 1
<= // false, because 2 is not less than or equal to 1
比较运算符经常用于控制语句,例如:
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".
也可以比较两个元组,只要它们元素数目相同,并且对应元素可以相互比较。
(, "zebra") < (, "apple") // true because 1 is less than 2
(, "apple") < (, "bird") // true because 3 is equal to 3, and "apple" is less than "bird"
(, "dog") == (, "dog") // true because 4 is equal to 4, and "dog" is equal to "dog"
注意:Swift的标准库只能比较少于7个元素的元组,如果需要比较更多元素,你需要自己实现比较运算符。
8、三目条件运算符
let contentHeight =
let hasHeader = true
let rowHeight = contentHeight + (hasHeader ? : )
// rowHeight is equal to 90
相当于以下代码:
let contentHeight =
let hasHeader = true
var rowHeight = contentHeight
if hasHeader {
rowHeight = rowHeight +
} else {
rowHeight = rowHeight +
}
// rowHeight is equal to 90
三目条件运算提供有效便捷的方式来表达二选一的选择. 需要注意的是, 过度使用三目条件运算就会由简洁的代码变成难懂的代码. 我们应避免在一个组合语句使用多个三目条件运算符.
9、Nil合并运算符
a ?? b
如果可选值a有值,则将其解包。反之,如果a等于nil,则返回默认值b。其中,a总是一个可选型的值,b则是一个与a解包的值类型一致的值。
上面的表达式可以看做下列表达式的缩写版:
a != nil ? a! : b
下面的例子,用nil合并运算符来作默认颜色和用户自定义颜色之间的选择。
如果提供的自定义颜色名为空,则返回默认颜色。
let defaultColorName = "red"
var userDefinedColorName: String? // defaults to nil var colorNameToUse = userDefinedColorName ?? defaultColorName
// userDefinedColorName is nil, so colorNameToUse is set to the default of "red"
如果自定义的颜色存在(名字符合要求),则返回自定义颜色。
userDefinedColorName = "green"
colorNameToUse = userDefinedColorName ?? defaultColorName
// userDefinedColorName is not nil, so colorNameToUse is set to "green"
10、区间运算符
(1)闭区间运算符
a...b 声明了一个包含a和b的值的闭区间。a必须不大于b。
for index in ... {
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
(2)半开区间运算符
a..<b 声明了一个包含a但不包含b的半开半闭区间。a的值必须不大于b。如果a等于b,则该区间为空。
let names = ["Anna", "Alex", "Brian", "Jack"]
let count = names.count
for i in ..<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
11、逻辑运算符
(1)逻辑非
let allowedEntry = false
if !allowedEntry {
print("ACCESS DENIED")
}
// prints "ACCESS DENIED"
(2)逻辑与
let enteredDoorCode = true
let passedRetinaScan = false
if enteredDoorCode && passedRetinaScan {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// prints "ACCESS DENIED"
(3)逻辑或
let hasDoorKey = false
let knowsOverridePassword = true
if hasDoorKey || knowsOverridePassword {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// prints "Welcome!"
(4)组合逻辑
if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// prints "Welcome!"
(5)显式括号增加可读性
if (enteredDoorCode && passedRetinaScan) || hasDoorKey || knowsOverridePassword {
print("Welcome!")
} else {
print("ACCESS DENIED")
}
// prints "Welcome!"
Swift3.0P1 语法指南——基本操作符的更多相关文章
- Swift3.0P1 语法指南——构造器
原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...
- Swift3.0P1 语法指南——下标
原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...
- Swift3.0P1 语法指南——方法
原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...
- Swift3.0P1 语法指南——属性
原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...
- Swift3.0P1 语法指南——类和结构体
原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...
- Swift3.0P1 语法指南——枚举
原档: https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programm ...
- Swift3.0P1 语法指南——闭包
原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...
- Swift3.0P1 语法指南——函数
原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...
- Swift3.0P1 语法指南——继承
原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...
随机推荐
- CentOS 7.0 安装配置LAMP服务器方法(Apache+PHP+MariaDB)
一.配置防火墙,开启80端口.3306端口 CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙. 1.关闭firewall: #停止firewall服务 sys ...
- PHPstorm激活
最近想学习一下PHP 于是下载了很不错的phpstorm 但这老外的工具是要购买正版的 所以就搜了一下破解激活的教程 发现现在网上的在线破解在2016.2版本里面大多已被封杀 尝试了本地破解也发现大 ...
- Python 操作 mongodb 数据库
原文地址:https://serholiu.com/python-mongodb 这几天在学习Python Web开发,于 是做准备做一个博客来练练手,当然,只是练手的,博客界有WordPress这样 ...
- PHP之:PHP框架
ThinkPHP - 国内PHP框架 http://www.thinkphp.cn/. OneThink-基于tp框架开发的CMS (适于小项目) http://www.onethink.cn/. ...
- appium+java+junit demo运行
对java熟悉一些,所以想用java把appium给做起来.今天用myeclipse给环境和Demo弄了一下,网上没有一篇全套资料的. 各块环境的搭建: 1.安装appium客户端,省略下载和安装步骤 ...
- 【Alpha阶段】第一次线上会议
会议信息 因编译作业ddl,暂时没有大进展,没有close的issue 时间:2016.11.07 19:00 时长:10min 地点:讨论组 类型:线上会议 NXT:2016.11.08 21:30 ...
- linux忘记mysql密码找回方法
linux忘记mysql教程密码找回方法 今天我们主要是讲一下关于linux忘记mysql密码处理方法,下面提供了5种linux忘记mysql密码找回方法哦. 方法一: # /etc/init. ...
- javascript之标识(zhi)符、关键字与保留字
正确区分标识(zhi)符.关键字与保留字 我发现很多初学者往往弄不清楚这三者的区别,甚至会把标识符的“识(zhi)”读作识(shi),真是愧对小学的语文老师啊!!! 注意:在JavaScript中,所 ...
- Java导包——import语句
使用语句import org.common.demo01.Demo: 或者import org.common.demo01.*: 如果一个类声明为public class,则文件名称必须与类名称一致, ...
- FCC上的初级算法题
核心提示:FCC的算法题一共16道.跟之前简单到令人发指的基础题目相比,难度是上了一个台阶.主要涉及初步的字符串,数组等运算.仍然属于基础的基础,官方网站给出的建议完成时间为50小时,超出了之前所有非 ...