【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
swift 的
asas!!?_总结
? 问号
用法:
声明变量的时候,但是没有初始化值(赋值的时候不用解包,直接赋值)- 在
对变量值操作前添加?,判断如果变量时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 |
原博:https://cellcell.vip/15777959828506.html
来源:oschina
链接:https://my.oschina.net/yinlei212/blog/3151841