Swift_符号表达式(【Int? = optional Int】、【as\as!\as?】、nil 代表值为nil非空、?可以选链..... )

func symbolAp(){
    
        //Int? 相当于 optional int 可选类型
        //一般用于类型转换可能会失败,例如 字符串 sss  转 int
        let sym:Int? = 1
        let sym2:Float? = Float("11.3")  //sym2 = 11.3
        let sym3:Float? = Float("as.v")  // sym3 = nil

        
        if sym2 != nil {   //sym2的值为 nil ,而不是Object-C 的空指针
            print("sym2 = \((String(format:"%.2f",sym2!))) \n")
        }
        
        if sym3 == nil {
            print("sym3 = nil,转换失败\n")
        }
        
        
        //as as! as?
        /*as  类型转换 从派生类转换为基类,向上转型(upcasts)*/
        let asNum = 10 as Int
        var asNum2 = 19.11 as Float
        var asNum3 = 19.11 as Float

        /*as! 强转    向下转型(Downcasting)时使用。由于是强制类型转换,如果转换失败会报 runtime 运行错误*/
        let asNum4 = "19.11" as! Float  //报错


        
        /*as? as? 和 as! 操作符的转换规则完全一样。但 as? 如果转换不成功的时候便会返回一个 nil 对象。成功的话返回可选类型值 /(optional),需要我们拆包使用。
              由于 as? 在转换失败的时候也不会出现错误,所以对于如果能确保100%会成功的转换则可使用 as!,否则使用 as?*/
        let asNum6 = "19.11" as? Int   //因为非强转,所以失败返回nil值

        
    }

?可选链

class Apple {

    var num:Int = 3
}


class Fruit {
    
    var apple:Apple?
    
}
//?可以选链
    /*
     如果你访问的值不是可选的,可选链式调用将会返回可选值。
     如果你访问的值就是可选的,可选链式调用不会让可选返回值变得“更可选”。
     因此:
     
     通过可选链式调用访问一个Int值,将会返回Int?,无论使用了多少层可选链式调用。
     类似的,通过可选链式调用访问Int?值,依旧会返回Int?值,并不会返回Int??。
     */
    func canType (){
        
        var fruit = Fruit()
        let t = fruit.apple?.num //?可选,允许返回nil值
//        let b = fruit.apple!.num //!强制打开,如果nil 运行时报错 fatal error: unexpectedly found nil while unwrapping an Optional value

        //实例 赋值
        fruit.apple = Apple()
        let c = fruit.apple!.num //c=3 这样实例后 强行打开也不会报错
        
    }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章