============ as 解析 ============
类型检查
1、is
is操作符可以判断一个实例是否是某个类的类型,如果是目标类型,结果返回true。 运用场景,类的多态性,判断一个父类实例的真正类型是不是子类类型。
类型转换:对象类型转换一定发生在继承的前提下
2、as 向上转换
仅仅应用于向上转换(子类类型转换为父类类型 - upcast少见), 比如
(Student子类 -> Person父类)
let p1 : Student = Student(xx,xx,xx)
let p11: Person = p1 as Person // as Person可以省略
3、as!向下转换 拆包
在类型转换过程中对可选值进行拆包,转换结果是非可选类型:
将非可选类型转换为非可选类型
将可选类型转换为非可选类型
--转换过程中,不能转换为目标类型的 会出现运行时错误。如果可选类型为nil转换为非可选类型也是会报错
4、as?向下转换 不拆包
在类型转换过程中不进行拆包,转换的结果是可选类型:
将非可选类型转换为可选类型
将可选类型转换为可选类型
--转换过程中,不能转换为目标类型的 不会出现运行时错误,结果是nil。如果可选类型为nil转换为可选类型也不会报错,转换之后的值也为nil。
==============================
====== 中 _ 和 !和 ? 分别是什么 ======
==============================
1、在swift中有么一个“_”符号,具体例子如下。
func greet(_ person: String, on day: String) -> String {
return "Hello \(person), today is \(day)."
}
分析:使用_代表忽略(不使用)参数标签。
2.!和?是什么东西呢?
? 和 ! 其实分别是Swift语言中对一种可选类型( Optional) 操作的语法糖。
?是一种判断后再拆包的语法糖
!是一种强制拆包的语法糖
当你不确定有值的时候就可以用 ?
当你确定有值的时候可以用 !
官方api.png例如: var name: String? Optional其实是个enum,里面有None和Some两种类型。
其实所谓的nil就是Optional.None , 非nil就是Optional.Some,
然后会通过Some(T)包装(wrap)原始值,
这也是为什么在使用Optional的时候要拆包(从enum里取出来原始值)的原因。
?的几种使用场景:
1.声明Optional值变量
2.用在对Optional值操作中,用来判断是否能响应后面的操作
3.用于安全调用protocol的optional方法
4.使用 as? 向下转型(Downcast)
!的使用场景
1.强制对Optional值进行拆包(unwrap)
2.声明Implicitly Unwrapped Optionals值,一般用于类中的属性
guard
与if语句相同的是,guard也是基于一个表达式的布尔值去判断一段代码是否该被执行。
与if语句不同的是,guard只有在条件不满足的时候才会执行这段代码。
你可以把guard近似的看做是Assert,但是你可以优雅的退出而非崩溃。
网友评论