Swift 之 as区别

1.?

定义:用?修饰的常量或者变量,代表这是一个可选类型的常量或者变量,就是说这个量可以有值,也可以没有值。如下例子,如果num有值就是int类型,如果没有值那就是nil
例子:
  let num: Int?                        // nil类型
  let num: Int? = 2                    // int类型

2.!

定义:如果要操作一个可选类型的变量,并且你需要进行强解包的时候,你就会用到!。如果有值就会得到变量的值,如果为nil那么程序就会crash

例子:
  // 定义一个String的可选类型str,显示赋值,不会crash,正常。
  var str: String? = "皇晓晨"
  let message = "你好" + str!
  print(message)

  // 定义一个String的可选类型str,不进行显示赋值,会crash
  var str: String? 
  let message = "你好" + str!
  print(message)
  Fatal error: Unexpectedly found nil while unwrapping an Optional value (致命错误:在展开可选值时意外发现nil)

3.as

定义:有保证的转换,从派生类转换为基类的向上类型

场景1:(从派生类转换为基类,向上转型)
  class Animal {}
  class Cat: Animal {}
  let cat = Cat {}
  let animal = cat as Animal

场景2:(数值类型转换,消除二义性)
  let num1 = 10 as CGFlot
  let num2 = 10 as Int
  let num3 = (10 / 2) as Double
  
场景3:(switch语句中进行模式匹配)
  switch animal {
    case let cat as Cat:
      print("如果是Cat类型对象,则做相应处理")
    case let dog as Dog:
      print("如果是Dog类型对象,则做相应处理")
    default: break
  }

4.as!

定义:强制类型转换,向下转型时使用,如果转换失败会报runtime运行错误

例子:
  class Animal {}
  class Cat: Animal {}
  let animal: Animal = Cat()
  let cat = animal as! Cat

5.as?

定义:与as!操作符的转换规则完全一样,但是as?如果转换不成功的时候便会返回一个nil对象。成功的话返回可选类型值。由于as?在转换的时候也不会出现错误,所以对于如果能确保100%会成功的转换则可以使用as!,否则用as?

例子:
  let animal: Animal = Cat()
  if let cat = animal as? Cat {
    print("转换成功~")
  } else {
    print("转换失败,是个nil")
  }



 

猜你喜欢

转载自blog.csdn.net/ios_xumin/article/details/123687056
今日推荐