美文网首页iOS技术分享程序员iOS Developer
Swift-自省(判断对象属于什么)

Swift-自省(判断对象属于什么)

作者: it_hao528 | 来源:发表于2017-08-23 11:50 被阅读672次
    我是谁.jpeg

    前言:向一个对象发出询问,以确定它是不是属于某个类,这种操作就称为自省。前段时间使用 Swift 时常遇到一个判断对象属于哪个类的情况,使用 Objective-C 的语法没有解决,于是就找了度娘终于解决了问题。正所谓好东西大家一起分享才会最大化体现出该好东西的价值,今天值此机会给大家分享一下我总结的内容。

    首先来看一下在 Objective-C 中常用的判断一个对象是属于哪个类的方法有下面两类:

    [obj1 isKindOfClass:[ClassA class]];
    [obj2 isMemberOfClass:[ClassB class]];
    

    -isKindOfClass: 判断obj1是否是ClassA或者其子类的实例对象;
    -isMemberOfClass:obj2做出判断,当且仅当obj2的类型为ClassB时返回为真。

    以上这两个方法是NSObject的方法,所以我们在 Swift 中如果写的是NSObject的子类的话,直接使用这两个方法是没有任何问题的,如下:

    class ClassA: NSObject { }
    class ClassB: ClassA { }
    
    let obj1: NSObject = ClassB()
    let obj2: NSObject = ClassB()
    
    obj1.isKindOfClass(ClassA.self)    // true
    obj2.isMemberOfClass(ClassA.self)  // false
    

    在 Swift 中提供了一个更简洁的写法:对于一个不确定的类型,我们可以使用is来进行判断。is在功能上相当于原来的isKindOfClass,可以检查一个对象是否属于某类型或其子类型。is和原来的区别主要在于它不仅可以用于class类型上,也可以对 Swift 的其他像是structenum类型进行判断。如下:

    class ClassA { }
    class ClassB: ClassA { }
    
    let obj: AnyObject = ClassB()
    
    if (obj is ClassA) {
        print("obj 属于 ClassA")
    }
    
    if (obj is ClassB) {
        print("obj 属于 ClassB")
    }
    

    另外,编译器将对这种检查进行必要性的判断:如果编译器能够唯一确定类型,那么is的判断就没有必要,编译器将会抛出一个警告,来提示你并没有转换的必要。如下:

    let string = "String"
    if string is String {
        // 
    }
    

    OK,到此结束了。内容不是很多,不过还是希望能够帮助到有需要的朋友。愿我们能够共同学习进步,在开发的道路上越走越远!谢谢!

    相关文章

      网友评论

        本文标题:Swift-自省(判断对象属于什么)

        本文链接:https://www.haomeiwen.com/subject/gtpdkxtx.html