-
as相关
- as 类型向上转换时使用;消除二义性时使用,比如一个数字是Int还是Double;如果不知道某个对象的具体类型(可能是以父类的形式储存的对象),可以在switch函数里使用as来指定类型(这个用法不知道有什么用处)引用自 http://www.111cn.net/sj/iOS/104926.htm
- as! 表示强制类型转换,转换不成功就runtime报错,类似c++的static_cast
- as? 表示可选的类型转换,如果转换不成功,则返回nil,有点类似c++的dynamic_cast
-
@escape相关
- 说白了这个东西就是标记一下,传入函数的lambda表达式是同步执行(比如某种transform函数)的还是异步执行(比如某种callback函数)的,是提供给编译器优化用的
-
闭包相关
- 语法
{code...}()
代表一个马上执行的闭包函数(暂时没有验证,只是自己的观察)
- 语法
-
(U)Int相关
- (U)Int分(U)Int(8,16,32,64),官方建议不要使用(U)Int32和(U)Int64,而是直接使用(U)Int类型,(U)Int类型在32位机器系统中就是32位,64位系统中就是64位,更具有可移植性
- 官方也不建议使用无符号数,最好使用单纯地使用Int类型,这样更加一致
-
类型别名typealias
- 使用方法:
typealias AudioSample = UInt16
- 跟c++的使用方式一样的
- 使用方法:
-
元组相关
- 元组感觉就是更加轻量化的匿名结构体,就是组织多个变量为一个复合体
- 元组内的成员可以不是同类型的
- 使用方式:
-
let http404Error = (404, "Not Found")
包装 -
let (statusCode, statusMessage) = http404Error
拆包 -
let (justTheStatusCode, _) = http404Error
只取其中某个值 -
print("The status code is \(http404Error.0)")
根据下标来访问成员 -
let http200Status = (statusCode: 200, description: "OK")
可以在定义元组的时候给成员一个名字
-
- 元组这个东西的好处是一些比较简单的,变量不多的对象就不需要再新建一个类了,确实可以节省代码
-
可选类型相关
- 可选类型有点类似Java中的@NonNull和@Nullable,@NonNull就表示肯定有值,@Nullable就是表示这里的可选的的概念
- 跟Java中类似,如果声明了一个可选变量(Java中为@Nullable或没有注解),且没有为其赋值,那么会默认为nil,如果是一个普通变量(Java中为@NonNull),那就必须为其赋值
- 在一个可选变量后加
!
表示强制获取该变量的值,这样的结果是可能会引起运行时异常,所以一般都是确定了该变量肯定有值的时候才会这么去用 - 可选绑定一般用在
if
或者while
语句中,典型用法如下:
if let actualNumber = Int(possibleNumber) {
print("\'\(possibleNumber)\' has an integer value of \(actualNumber)")
} else {
print("\'\(possibleNumber)\' could not be converted to an integer")
}
// 输出 "'123' has an integer value of 123"
表示Int(possibleNumber)
结果如果不是nil则把值赋给actualNumber
然后进入if体,否则进入else体
- 隐式解析可选类型就是把类型后面的
?
改成!
,表示这个变量一定有值,以后再取的时候就不用在变量后面加!
来取值了,具体用法:
let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // 需要惊叹号来获取值
let assumedString: String! = "An implicitly unwrapped optional string."
let implicitString: String = assumedString // 不需要感叹号
//let assumedString: String!这样声明后,assumedString仍然可能是nil的,
//并不是这样声明就强制你一定要声明时赋值,所以使用assumedString的时候仍然有
//运行时错误的风险
问题是如果什么都不加呢?代表是肯定有值还是什么?
隐式解析可选类型本质上仍然是可选类型,所以可选类型可以做的事情隐式解析可选类型都可以做
注意:
如果一个变量之后可能变成nil的话请不要使用隐式解析可选类型。如果你需要在变量的生命周期中判断是否是nil的话,请使用普通可选类型。
- 异常处理相关
- 直接看示例代码
func makeASandwich() throws {
// ...
}
do {
try makeASandwich()
eatASandwich()
} catch SandwichError.outOfCleanDishes {
washDishes()
} catch SandwichError.missingIngredients(let ingredients) {
buyGroceries(ingredients)
}
- 断言的用法跟其他语言差不多
网友评论