比较Swift Any.Type与继承

时间:2018-01-06 16:25:40

标签: swift

我正在尝试比较两个Any.Type。 我想要检查的是某种类型是否等于 OR 继承该类型。

EG。 UIView类型为UIView.Type,但它也继承自NSObject.Type。 我有问题要检查第二个。 Swift可以吗?

〔实施例:

class Object: NSObject {
    var name: String = "aloha"
}

class Other {
    var obj: Object?
}


let key = \Other.obj
let keyType = type(of: key)

keyType.valueType == Object?.self // true
keyType.valueType == NSObject.self // false - how can I make it true?

编辑1:

我的最终目标是使用通用VC来编辑任何(CoreData)对象。我想根据var的类型显示不同的单元格。 我找到了一种不同的方式来实现我上面描述的内容(我希望 - 更好的方法)。 我仍然在这里遇到一个问题。虽然我终于可以找到对象的类型,但我想检查该类型是否符合我的协议,如果是,则调用其方法。 示例代码可能会更好地解释它:

protocol MyProtocol: class {
    static func someIdentifier() -> String
}

class Object: NSObject, MyProtocol {
    var name: String = "aloha"

    static func someIdentifier() -> String {
        return "This is it!"
    }
}

class Other: NSObject {
    var obj: Object?

}


let key = \Other.obj
let keyType = type(of: key)

let other = Other()
let value: Any? = other[keyPath: key]

if let object = value as? NSObject? {
    if let protocolObject = object as? MyProtocol {
        print("Yey!") // Can't get here :< What should I do to be able to call methods of MyProtocol?
        // protocolObject.myIdentifier() // :< How?
    }
}

1 个答案:

答案 0 :(得分:0)

无法到达 ,因为value又名objnil

请看这个。我将someIdentifier()更改为实例方法,并将Object实例分配给obj。此外,我删除了不必要的类型注释let value: Any?,因为从Object转换为Any的类型使其更糟,并通过删除第二个问号来合并可选的向下转换if let object = value as NSObject?。 / p>

protocol MyProtocol: class {
    func someIdentifier() -> String
}

class Object: NSObject, MyProtocol {
    var name: String = "aloha"

    func someIdentifier() -> String {
        return "This is it!"
    }
}

class Other: NSObject {
    var obj: Object?
}


let key = \Other.obj
let keyType = type(of: key)

let other = Other()
other.obj = Object()
let value = other[keyPath: key]

if let object = value as NSObject? {
    if let protocolObject = object as? MyProtocol {
        print(protocolObject.someIdentifier()) // This is it!
    }
}