swift 通俗易懂 之 as as! ! ? _
2019-12-31 本文已影响0人
_oeo___
swift 的
as
as!
!
?
_
总结
? 问号
用法:
-
声明变量
的时候,但是没有初始化值(赋值的时候不用解包,直接赋值
) - 在
对变量值操作前添加?
,判断如果变量时nil,则不响应后面的方法。 - 不知道有没有值,先判断再解包使用 , 比如作为
参数
或者返回值
. - Optional可遗传 如例子中:
let v = d.name?.lowercased().count
打印为:Optional(3)
class Dog: Animal {
var name:String?
var age:Int?
}
let d:Dog = Dog()
d.name = "leo"
let v = d.name?.lowercased().count
print(v)
# print: Optional(3)
! 感叹号
-
强制解包
在对变量操作前添加!,表示默认为非nil,直接解包进行处理 - 声明时添加!,告诉这个是
Optional 类型声明
的,并且之后对该变量操作的时候,都隐式的在操作前添加!
_ 下划线
在方法声明中使用代表不用使用参数名成接受参数,代表默认参数
。
func hello_default(_ default1:String){
print(default1)
}
func hello_no_default(noDefault:String){
print(noDefault)
}
hello_default("正确")
hello_no_default("错误")
hello_no_default(noDefault: "正确")
as & as!
as 是派生类到基类转换(cat 属于Animal),这样转换很自然,不要强制转换
。
class Animal{}
class Dog:Animal{}
let cat = Dog()
let dog = cat as Animal
as!
这个是类型强制转换,什么时候需要强制转换呢,就是类型不明确的时候.派生类向基类转换
, 如下面 animal 其实可以是Cat也可以是Dog,那么是哪个呢! 其实是需要判断的,这个就需要强制转换
, 如果转换失败会报runtime运行错误 Exception
。
class Animal{}
class Cat:Animal{}
class Dog: Animal {
}
let animal:Animal = Cat()
let cat = animal as! Dog # throw 异常
let cat = animal as? Dog # cat = nil
as?
和上面as!
相似 也是向.派生类向基类转换
,但是不同的是,如果转换失败他不会报异常Exception
而是会返回 nil
.
let animal:Animal = Cat()
if let cat = animal as? Cat{
print("这里有猫")
}else{
print("这里没有猫")
}
as - 总结
name | 方向 | 转换成功 | 转换失败 |
---|---|---|---|
as | 派生->基类 | 基类对象 | - |
as! | 基类->派生(Upcast ) |
派生类对象 | throw Exception |
as? | 基类->派生(Downcast ) |
optional(派生类对象) | nil |