一、可选类型
swift的可选类型用于处理变量可能为nil(空值)即缺失的情况。在swift中,可选类型通过在原始类型后面添加问号(?)来声明(注意:类型与?之间没有空格)。例如以下的这两个声明是相同的:
这两种情况,都可以声明变量为可选整数类型变量.同时显示声明也可以如
1.可选类型的枚举
swift的可选类型实际上是一个枚举(枚举是一种用于定义一组相关值的类型,它允许在一个类型安全的方式下定义一组相关的值,并且可以在代码中使用这些值,枚举可以包含不同的数据类型)类型,包含none(没有值)和some(包含一个值).
2.可选类型的使用
2.1范围给定
声明可选变量的时候,不仅要确保使用?使用,同时也要使用问好给?操作符合适的范围。
例如,我们在声明整数数组的时候,如果下成下面的第一个形式就会报错,正确的写法应该是第二个形式. (应写成 (Int[])? 写成 Int[]? 会报错。)
2.2初始值
当声明应该可选变量或者可选属性(类、结构体和枚举的属性)的时候没有提供初始值,那么它的值默认为nil(空值).
2.3布尔环境中应用
在布尔环境中,如果可选类型的值为Optional.some(包含一个值)那么这个可选类型等于true,否则为false.
2.4访问
可选类型可以用后缀操作符感叹号(!)来访问这个值。
3可选类型与nil的比较
可选类型与Objective-C中指针nil的值(表示指针不再指向任何有效的对象)很相似,但nil只对类(class,而可选类型对所有类型都可以使用,且更加安全。
4.隐藏式可选类型(自动解析)
当确定一个可选类型总是包含值时,可以使用隐藏式解包可选类型,将!放在类型的末尾,表示在使用该值的时候可以自动解包,如图下面的例子:
5.强制解包
当确定可选类型确实包含值以后,可以使用!(用于表示已知可选有值可以使用)来强制解包可选类型,注意:如果可选类型为nil(空值),强制解包会导致允许时崩溃。
6.可选绑定
使用可选绑定可以判断可选是包含值,如果包含就把值赋值给一个临时常量或变量。可选绑定可以在if和while语句中来对可选类型的值进行判断并把值赋值给一个常量或变量。如下有可选绑定的实例:
运行的结果为:
二、字面量
定义:表示特定类型的常量值的语法表示形式,允许直接指定常量的值,而不是通过变量或表达式进行计算。
1.整型面量
整型字面量可以是一个十进制、二进制(0b开头)、八进制(0o开头)或十六进制(0x开头)常量。
2.浮点型字面量
浮点型字面量有整数部分,小数点,小数部分及指数部分。
浮点型字面量可以是Float或Double类型。swift默认的浮点型字面量类型是Double。(如果要使用Float类型的浮点数,可以在字面量后面加F或者使用显示类型声明)。浮点型字面量默认用十进制表示,要使用十六进制表示要加前缀0x。
浮点型字面量(十进制)由十进制数字后跟小数部分或指数部分组成。
2.1.小数表示法
2.2.科学计数法表示法
2.3.十六进制表示法
十六进制浮点型字面量由0x后跟可选的十六进制小数部分以及十六进制指数部分组成。十六进制小数部分由小数点后跟十六进制数字串组成。指数部分由大写或小写字母p为前缀后跟十进制数字串(e之前的数量乘以10的几次方)组成,如以下的例子:
(0xFp2 表示 15 ⨉ 2^2,也就是 60;同样,0xFp-2 表示 15 ⨉ 2^-2,也就是 3.75。)
2.4.可读性
浮点型字面量允许使用下划线和在数字前加0来增强数字的可读性,不会影响字面量的值。
3.字符串型字面量
字符串的字面量,用双引号括起来。
注意:字符串型字面量不能包含未转义的双引号(“),未转义的反斜线(\)、回车符或转行符。
4.布尔字面量
布尔型字面量的默认类型是Bool,布尔值字面量有三个值:true(真),false(假),nil(没有值)。
5.数组字面量
6.字典字面量
三、运算符
1.算术运算符
算术运算符包括加号(+)、减号(-)、乘号(*)、除号(/)、求余(%)
注意:swift语言的最新版本,中自增(++)、自减(--)运算符已被移除。
例子:编写包含以上运算符的计算器。
2.比较运算符
比较运算符包括等于(==)、不等于(!=)、大于(>)、小于(<)、大于等于(>=)、小于等于(<=)
例子:
运行的结果为:
3.逻辑运算符
逻辑运算符包括:与(&&)、或(||)、非(!)
例子:
运行的结果为:
4.位运算符
位运算符用来对二进制进行操作,~(取反),&(与),|(或),^(异或),<<(左移),>>(右移)。下面我以下面的例子来一一说明。
其中:A为2转化为2进制就为10
B为3转化为2进制为11
运行的结果为:
1.与
a&b:对a,b每一位(二进制)进行与操作,只有两个位都为1时候,结果才为1,否则为0.
2.或
a|b:对a,b每一位进行或操作,只要两位中至少有一个1,结果就为1
3.异或
a^b:对a,b每一位进行异或操作,当两个位不相同,结果为1
4.取反
~a:对a,每一位进行取反操作,即对a的每一位都取反
5.左移
a<<b:将a的所有位左移b位,右侧空缺的位用0填充。
a>>b:将a的所有位右移b位,左侧空缺的位用0填充。
5.赋值运算符
例子:
运行的结果为:
6.区间运算符
1.闭区间运算符
闭区间运算符(a...b)(a<b)定义一个包含从a到b(包括a和b)的所有值的区间。常用在for in循环中
2.半开区间运算符
半开区间(a..<b)定义一个从a到b但不包含b的区间,注意:包括a。
7.其他运算符
1.一元运算符
一元运算符对单一操作对象操作,一元运算符分前置运算符(需要紧跟在操作对象之前)和后置运算符(需要紧跟在操作对象之后),区分:在C语言中没有c!的语法,在swift中用在Optional类型取值,如一元减(-3)、一元加(+2)。
2.二元运算符
二元运算符操作两个操作对象,而且放置在对象之间。如(2 + 3)
3.三元运算符
和C语言一样,A?B:C(A为真执行B,A为假执行C)
8.运算符优先级
不同优先级从高到低,相同优先级大多数按从左到右,只有三个优先级从右到左(单目运算符(一元运算符)、条件运算符、赋值运算符)。
基本的优先级:
- 指针最优,单目运算优于双目运算。如正负号。
- 先乘除(模),后加减。
- 先算术运算,后移位运算,最后位运算。请特别注意:1 << 3 + 2 & 7 等价于 (1 << (3 + 2))&7
- 逻辑运算最后计算
四、条件语句
1.?:运算符
a?b:c;
表示a为真执行b,a为假执行c。
2.if语句
组成:由一个布尔表达式和一个或多个执行语句组成。
语法:if a{
//如果布尔表达式为真将执行语句
}
例子:
运行结果为:
3.if...else语句
语法:if a {
/* 如果布尔表达式为真将执行的语句 */
} else {
/* 如果布尔表达式为假将执行的语句 */
}
例子:
运行的结果为:
4.if...else if...else语句
一个if语句后可以跟一个可选的else if...else语句。但使用的时候注意:
- if 语句后可以有 0 个或 1 个 else,但是如果 有 else if 语句,else 语句需要在 else if 语句之后。
- if 语句后可以有 0 个或多个 else if 语句,else if 语句必须在 else 语句出现之前。
- 一旦 if 语句执行成功,其他的 else if 或 else 语句都不会执行。
语法:
if a1 {
/* 如果a1 表达式为 true 则执行该语句 */
} else if a2 {
/* 如果 a2 表达式为 true 则执行该语句 */
} else if a3 {
/* 如果 a3 表达式为 true 则执行该语句 */
} else {
/* 如果以上所有条件表达式都不为 true 则执行该语句 */
}
例子:
运行的结果为:
5.内嵌if语句
在if或else if语句内使用另一个if或else if语句
语法:
if a1 {
/* 当 a1 表达式 true 时执行 */
if a2 {
/* 当 a2 表达式 true 时执行 */
}
}
例子:
运行的结果为:
6.switch语句
语法:
switch expression {
case expression1 :
statement(s)
fallthrough /* 可选 */
case expression2, expression3 :
statement(s)
fallthrough /* 可选 */
default : /* 可选 */
statement(s);
}
注意:一般在switch语句中不使用fallthrough语句(用于继续执行下一个 case)。在大多数语言(如C语言)中switch语句块中case之后的语句会顺序运行,所有想要终止运行要在case后紧跟break,但对于swift语言中,默认是不会执行下去的,switch也会终止,如果想要case后面语句按照顺序运行,则需要用fallthrough)
例子:
有fallthrough:
运行的结果为:
没有fallthrough:
运行的结果为: