Swift超基础语法(is与as篇)

类型判断(is)

还记OC中有下面这么一个方法么?

[path isKindOfClass:[NSString class]];  //判断,一个对象是否属于一个类,返回值是一个BOOL类型

然而Swift中并没有这个方法,取而代之的是is这个关键字,它能判断的不仅是对象,还可以判断基本数据类型等等,如下

例:
        if number is Int {  //判断一个变量是否是Int类型,返回值是一个Bool类型
            print(number)  
        }
        if view is UIView {  //判断一个对象是否属于一个类,返回值是一个Bool类型
            view.frame = CGRectMake(100, 100, 100, 100)
        }
Tips:BOOL与Bool
BOOL:是OC中的类型,取值为YES或NO,但其本质为整型
Bool:是Swift中的类型,取值为ture或false,这两个关键字是真正的真与假,并不是Int类型(ture/false与YES/NO在内存中所占字节数是不同的)

类型转换(as)

"as"的作用是将NSObject转换为具体类型(对一个实例进行类型转换)

  • as?
    将NSObject转换成一个可选类型,可能转成功也可能不成功,如果成功则转换为?后面的类型,如果不成功就还是NSObject类型,也就是说接收转换值的变量也应该是一个可选类型
例1:
        let infoDic = ["name" : "lyu" , "age" : 18]  //此时,字典存储的vale值为NSObject类型
        let name : String? = infoDic["name"] as? String  //将NSObject转换成为Optional类型
        let length : Int? = name?.characters.count  //做好类型转换后,就可以调用characters方法,从而计算出字符串长度,
        //let length : Int = name!.characters.count  //另外,此时我明确的知道name的值不是nil,所以也可以将上一句的name?改为name!,不过不建议这么做
        print(length!)  //解包
}  //结果:控制台打印3
例2:
        let infoDic = ["name" : "lyu" , "age" : 18]  //此时,字典存储的vale值为NSObject类型
        let name : String? = infoDic["age"] as? String  //将NSObject转换成为Option类型,实际上age的值是Int类型,所以此时并不能转换成功,但不会崩溃,而是返回nil
        //let length : Int = name!.characters.count  //这句代码是会导致运行时崩溃的,因为name此时是一个nil,没办法强制解包哦,这就是例1中引入可选链的原因
        let length : Int? = name?.characters.count  //此时name的值为nil
        print(length)  //你知道这个时候length实际上是nil的对吧?千万不要强制解包哦(length!),结果:控制台打印nil
  • as!
    将NSObject转换成一个具体类型,如果不成功直接崩溃
例:
        let infoDic = ["name" : "lyu" , "age" : 18]  //此时,字典存储的vale值为NSObject类型
        let name : String = infoDic["name"] as! String  //将NSObject转换成为String类型(具体类型)
        let length : Int = name.characters.count  //做好类型转换后,就可以调用characters方法,从而计算出字符串长度(具体类型)
        print(length)  //无需解包,打印结果为3
但是下面这段代码会导致运行时崩溃:
        let name : String = infoDic["age"] as! String  //这是因为age的值本身为为Int类型,无法转换为String类型,as!语法强制它为String类型的话,那么系统只好崩溃了
  • as嵌套在可选绑定中的几种写法
    • 写法1:
        let infoDic = ["name" : "lyu" , "age" : 18]
        if let value = infoDic["name"] {  //解包
            if let name = value as? String {  //类型转换
                print(name)
            }
        }
  • 写法2:
        let infoDic = ["name" : "lyu" , "age" : 18]
        if let name = infoDic["name"] as? String {  //解包同时类型转换
            print(name)
        }

你可能感兴趣的:(Swift超基础语法(is与as篇))