概览
- 类和结构体的区别在于结构体总是copy的。而类是传递引用
- 用Throw来抛出异常,用Throws来表示一个函数可以抛出异常。
- 不管函数是否抛出异常,defer所包围的语句都会被执行
- Swift中不能为非可选类型的变量赋值为nil。在Swift中,nil表示值为空。而在OC中,nil表示对象不存在。
- 断言会终止程序运行,而抛出异常则不会。
- 断言会在条件判断为false的时候执行。
- 可选类型解包的一个特殊形式:
“var colorNameToUse = userDefinedColorName ?? defaultColorName” - Swift的逻辑判断是“从左到右”的
- foundation被import之后,可以在String对象上使用NSString的方法,而不用转换类型
String
- String是一个“值类型”,它指的是在传参or赋值的时候,值会被拷贝。
数组
- 使用数组的时候,如果要判空,最好使用isEmpty。因为对于某些不遵循hasRandomAccess协议的集合类来说,使用count属性会造成遍历。
但是!!!如果数组为nil,使用isEmpty会报错!最好先用nil来判断一下 - 如果要移除最后一个项目,可以使用removeLast()来避免遍历。
-
遍历时,如想同时获取index和value可以使用:
Set
- Set的内容是无序且唯一的。如果顺序不重要,但是需要保证每个数据只出现一次,可以使用Set来代替Array
-
Set的声明必须带有Set关键字,因为如果只是用类型提示功能的话,set的写法和array的写法一毛一样:
- Set是无序的,因此遍历的时候,每次结果都不一致。如果希望排序,可以调用sorted()方法。该方法会让set内容升序排列。
如果希望降序排列,可以调用sorted(by:>)方法。
字典
- 字典的键必须遵从Hashable协议。
- 字典的键不一定是string类型。反正只要保证key是同一类型,value是同一类型就OK
for-in loop
- 灵活使用闭区间操作符 … for index in a…b 表示index从 a 到 b 取值,包含a和b
Switch
-
可以进行区间比较。详情如图:
-
可以使用元组作为条件语句:
如果被switch对象满足多个case,则只走第一个case的语句。其他case将被忽略掉。
-
switch可以和where联用:
-
使用statementLabel你可以给自己的循环or条件语句起个名字。在多重嵌套时可以方便地通过名称来告知编译器需要break 或者 continue哪个语句。
guard语句:
在条件不满足时才执行。和if完全相反
guard一定要跟一个else!
函数
- 无返回值的函数其实会返回一个Void,它是一个空的元组。
-
可以通过设定返回值为元组类型来返回多个值:
-
元组名在函数定义返回值的时候就被指定了,所以在填写返回值的时候不必再给它命名。同时,接收函数返回值的那个对象也可以通过点下标来获取元组的每一个值:
- 嵌套函数:是一个有名字,并且可以捕获其封闭函数域内值的闭包。
闭包
which is a closure type。也就是说,怎么排序,你可以说了算。
PS:排序算法要求返回的结果遵循:如果str1可以出现在str2前面,返回true。否则,返回false。sorted(by)方法重载了运算符,因此可以直接输入大于小于符号来表示需要升序还是降序
-
当函数的最后一个参数为闭包的时候,可以使用尾随闭包,来避免由于闭包本体过长造成调用语句的可读性的下降。例如:
逃逸闭包:多用来做函数回调。它表示一个闭包会在函数返回之后才被调用。逃逸闭包被存储在函数外部的某个地方,所以当函数return了之后,闭包也不会被释放掉。
由于闭包也是函数的一种特殊类型,所以调用的时候一样要加括号!
自动闭包:指的是直接将一段代码作为闭包传递给某个变量,系统可以自动将它作为闭包来处理。更为优雅的写法是,给函数的闭包参数添加@autoclosure关键字,这样的话,你可以直接把代码传递给该自动闭包参数。
func serve(customer customerProvider: @autoclosure ()->String ) {
print("Now serving (customerProvider())")
}
serve(customer: customers.remove(at: 0))
枚举
Swift中的枚举常量可以被赋值为String, character,Int or Float类型。
-
枚举常量用关键字case来标注:
-
在对枚举进行switch操作的时候,如果case常量有关联值,可以对每个关联值 分别展开:
-
枚举变量也可以从raw value来创建。如图:
返回的值是一个可选类型。如果Plante枚举中没有raw value为7 的常量,那么该方法返回nil。
-
递归枚举:如果一个枚举中的某些常量包含和自己同类型的关联值,那么这个枚举就是递归枚举。递归枚举用indirect来表示。
![](http://upload-images.jianshu.io/upload_images/2296348-d435401b8c02fb63.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
嵌套枚举:
enum Character {
enum Weapon {
caseBow
caseSword
caseLance
caseDagger
}
enum Helmet {
caseWooden
caseIron
caseDiamond
}
caseThief
caseWarrior
caseKnight
}