swift - 确定 swift 对象是否具有父类(super class)

标签 swift superclass

我想要一个运行时测试来确定当前对象是否有父类(super class)。编译器拒绝

if super {
  //do something
}

知道什么会起作用吗?

最佳答案

我正在在线 REPL 上对此进行测试,因为我目前只有这些。如果它在常规环境中不起作用,请告诉我,我会把它记下来...

您有几个选择。首先,您可以通过使用可选的 as? 运算符进行强制转换来检查对象是否具有特定的父类(super class),如下所示:

class MyClass { }
class MySubClass: MyClass { }

let mSub: AnyObject = MySubClass()

if let m = mSub as? MyClass {
    println("I am a subclass of MyClass")
}

如果您只想知道该对象是否有任何父类(super class),而您不知道该父类(super class)可能是什么,您可以使用以下 hack 找出是否有父类(super class):

let mSub: AnyObject = MySubClass()

let description: String = {
    var temp = String()
    dump(mSub, &temp)
    return temp
}()

if let r = description.rangeOfString("super") {
    println("I am a subclass...")
}

那应该打印I am a subclass...

如果你想获得真正的 hack-y,你可以像这样解析 description:

let charSet = NSCharacterSet(charactersInString: "\n ")
let classNames = description.componentsSeparatedByCharactersInSet(charSet).reduce([String]()) {
    if let period = find($1, ".") {
        let range = advance(period, 1)..<$1.endIndex
        let className = $1.substringWithRange(range)
        return $0 + [className]
    }
    return $0
}

如果你打印 classNames 你应该得到:[MySubClass, MyClass]

// Edit:  Update for Swift4, and wrapped into function
func classHierarchyTypeNames(for object: AnyObject) -> [String] {

    let description: String = {
        var temp = String()
        dump(object, to: &temp)
        return temp
    }()

    let charSet = CharacterSet(charactersIn: "\n ")
    let classNames: [String] = description.components(separatedBy: charSet).reduce([String]()) {

        // `description` includes quite a lot of non-class cruft.
        // Check for an identifying prefix for your classes, 
        // as well as the `"."` character.
        if ($1 as NSString).range(of: "<#MyFramework#>.").location != NSNotFound, 
            let period = $1.index(of: ".") {
            let classNameStart = $1.index(period, offsetBy: 1)
            let className = $1.suffix(from: classNameStart)
            return $0 + [String(className)]
        }
        return $0
    }

    return classNames
}

关于swift - 确定 swift 对象是否具有父类(super class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28629943/

相关文章:

java多态后期绑定(bind)规则

java - 如何发现方法中必须使用什么参数格式?

ios - UIPageViewController 与 WKWebView

ios - 如何指向和定位 arkit 文本

ios - 如何在 Swift 3 的子类中覆盖 Init()

c++ - 为什么编译器找不到父类(super class)的方法?

java,从父类(super class)初始化子类

Swift - AVplayer 数组?

swift - 将日期设置为 DatePicker 和监听器以更改值和删除 AR 前缀

ios - Objective C - 对象分配良好实践