Learning Swift 3

preface

16年初时学过 Swift 2.2 版本,由于实际项目中并未使用,长时间后记忆模糊且历经 2.x->3.x->4.x 版本迭代,打算重新回顾下知识。
本次暂采用人民邮电出版社的《Swift3 开发指南》(很薄的一本),之所以未采用最新版 Swift 4 是因为:①目前尚未找到合适的书籍(有本国外很厚的但贵了些且看原版较慢);②就个人而言看纸质版效率更高,而电子版易分心。
本书为 Swift 3.1,与 Swift 4.x 语法差异后边再单独补充一下即可。

变量和基本数据类型

标识符

标识符是为变量、常量、方法、函数、枚举、结构体、类和协议等指定的名字。
标识符规范:(略)

关键字

关键字是一些具有特殊用途的单词。

常用关键字:class, deinit, enum, extension, func, import, init, let, protocol, static, struct, subscript, typealias, var, break, case, continue, default, do else, fallthrough, if, in, for, return, switch, where, while, Nil, nil, as, dynamicType, is, new, super, self, Self, Type, associativity, didSet, willSet, get, infix, inout, left, mutating, none, nonmutating, operator, override, postfix, precedence, prefix, rightset, unowned, unowned(safe), weak.

表达式

表达式由操作数和运算符组成。

语句

语句是指有返回值的表达式。
一条语句结束后可不加分号,也可加分号。

单行注释

//

多行注释

/**/
Swift 支持多行嵌套注释,其它语言不支持。

常量和变量

常量

let
隐式推断 和 显示推断

变量

var

数据类型

整型、浮点型、布尔型、字符串型、元组型、集合、枚举、结构体、类

整型

Swift 提供 8、16、32、64 位形式的有符号及无符号整数。包括:Int8, Int16, Int32, Int64, Int, UInt8, UInt16, UInt32, UInt64, UInt.
Int:在 32 位 -> Int32;在 64 位 -> Int64
UInt:在 32 位 -> UInt32;在 64 位 -> UInt64

二进制数 0b
八进制数 0o
十六进制数 0x

Swift 中,为便于阅读,可添加下划线。

1
2
3
e.g.
var myMoney = 3_360_000 // 一般每隔三位加下划线
let phone = 185_1234_5678

布尔型 Bool

true, false

浮点型

浮点型主要用来存储小数数值,或范围较大的整数。
浮点数 Float
双精度浮点数 Double (默认)

浮点型也可采用下划线方法

1
let  pi = 3.141_592_654

字符串型 String

声明为letvar来实现不可变字符串、可变字符串

元组型

元组型是多个值组成的复合值类型,能够便于管理和计算。元组型由若干个任意类型的数据组成,组成组圆形的数据成为“元素”。

1
2
3
4
5
6
7
8
9
10
11
e.g.
let time1 = (2018, 2, 17)
let time2 = (year:2018, month:2, day:17)

// 可以通过下标访问元组中的数据,也可通过元素名访问

// 可以把一个元组的内容分解成单独的常量和变量
let (year, month, day) = time2

// 如果只需要一部分元组值,分解时可以把要忽略的部分用下划线`_`标记
let (year, month, _) = time2

可选型

在数据类型后面加上?即可定义一个可选性数据。
目的:为了处理可能缺失值的情况。
特点:可以有值,也可以没有值。没有值时,为nil。

可选绑定:可选型在 if 或 while 语句中赋值并进行判断
强势拆包:读取可选型数据值时,加上!来获取该值
隐式拆包:声明可选型数据时将?改为!

数据类型的转换

整型之间的转换
整型与浮点型之前的转换
整型与布尔型之间的转换
整型与字符串型之前的转换

常见运算符和表达式

算术运算符

“+ - * / %”

赋值运算符

“= += -= *= /= %=”

关系运算符

“== != > < >= <= === !==”

逻辑运算符

“! && ||”

三元运算符

“问题 ? 答案1 : 答案2”

Nil Coalescing 运算符 (空合运算符)

“let c = a ?? b” 相当于 “let c = a! = nil ? a! : b”
其中,a 必须为可选型,b 的类型必须与 a 解包后值类型一致

其它

自增自减运算符

“++ –”

区间运算符

闭区间运算符
a…b 相当于数学中的”[a, b]”
半闭区间运算符
..< “[a, b)”

流程控制语句

循环语句

for-in, while, repear-while

for-in 语句

遍历集合

范围运算符
a…b, a..<b

while 语句

先执行判断条件,在循环次数未知的情况下使用

repeat-while 语句

先执行一次循环体,然后再判断循环条件

1
2
3
repeat {
语句组
} while 循环条件

条件语句(分支语句)

if语句

if, if else, else if

switch语句

case 分支不需要显式地添加 break 语句
每个 case 后可以跟一个值或多个值,多个值之间用逗号分隔
每个 case 中至少要有一条语句
switch 能支持多种数据类型,包括浮点型、布尔型、字符串型等
switch 语句中可使用范围匹配
switch 语句中比较元组型数据,使用元组时还可使用值绑定和 where 语句

控制转移语句

continue 语句

可带标签

break 语句

可带标签

fallthrough 语句

只能用在switch语句中

return 语句
throw 语句

流程嵌套

字符和字符串

Character

Unicode 编码

Unicode 编码,表现形式\u{n},包括单字节编码、双字节编码 和 四字节编码。

字符串常见操作

1
2
3
4
5
6
7
8
9
str.character.count
> < >= <= == != 判断依据为 Unicode 编码值大小,且从第1位依次比较(跟字符串长度无关)
str.hasPrefix(String), str.hasSuffix(String)
upercased(), lowercased(), capitalized
str.insert(newElement: Character, at:Index), str.startIndex, str.endIndex e.g. str[str.startIndex]
str.append(), +, str.append(String)
str.remove(at:Index), str.removeSubrange(bounds:Range<Index>), str.removeAll()
str.subString(from:Index), str.subString(to:Index), str.subString(with:Range<Index>)
str.replaceSubrange(bounds:Range<Index>, with:String) ...

String 与 NSString 关系

String 是值类型,而 NSString 是类。

可使用as运算符进行类型转换

Collection 类型

数组

数组是由一组类型相同元素构成的有序数据集合。

数组的创建

类型格式:Array<ElementType>[ElementType]。其中前者为泛型写法,后者为简写方式。

let、var 分别声明为不可变数组、可变数组

在没有明确指定数组类型时,可以在数组中存放不同类型的元素。

多个相同元素时,可以快速创建 e.g. Array(repeating:0.0, count:3)

数组的访问

通过下标访问
对数组中单个元素访问
for-in 循环遍历数组
使用全局的 enumerate 函数获取每个元素的索引和值

1
2
3
for (index, value) in languageList.enumerated() {
print("Item \(index + 1): \(value)")
}

count, isEmpty

数组的编辑

追加 append(Element), “+”操作符
插入 insert(newElement:Element, at:Index)
删除 remove(at:Int), removeAll(), removeLast()
替换 通过下标赋值来修改、替换

数组的复制

数组属于值类型,值类型在赋值或参数传递时会发生复制行为,赋予的值或传递的参数是一个副本。
而引用类型在赋值或参数传递时不会发生复制行为,赋予的值或传递的参数是一个引用。

Array 与 NSArray 的关系

NSArray 是类类型,而 Array 是结构体类型。前者为引用类型,后者为值类型。
一个 NSArray 对象桥接之后的结果是 [AnyObject]数组(保存 AnyObject 元素的 Array 数组)

可使用as!进行转换

字典

字典有键和值两部分构成,是一种存储多个类型相同的值的容器,每个值都和唯一的键相对应。

类型格式 Dictionary<KeyType, ValueType>

集合

------ END ------
0%