swift 通俗易懂 之 as as! ! ? _

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

你可能感兴趣的:(swift 通俗易懂 之 as as! ! ? _)