在变量中传递类类型

时间:2015-10-22 21:38:27

标签: ios swift

在swift 2.0中有一种方法可以在变量中传递类的类型,以便稍后我可以使用它来检查对象类型是否为“类”类型。 通过以下示例更好地解释:

class Base {..}
class Derived : Base {..}
var obj: Base = Derived()
if obj is Derived {
   print("obj is Derived type")
}

这很好。但是我希望能够将类型'Derived'存储在这样的变量中:

let classType = Derived  // Of course this will give compile error

稍后使用它来检查对象的类型:

if obj is classType {..}

我最接近处理保存类类型的是:

let classType = Derived.self

这表示classType的类型为'Derived.Type',但您无法真正使用它来检查对象类型,如下所示:

if obj is classType {..blah.. } // Compile error.'Use of undeclared type 'classType'

我希望你明白我的观点。我正在尝试将类类型存储在变量中,然后使用它来检查对象是否属于该类型。 有没有办法做到这一点。 我查看了堆栈溢出的类似论坛,但没有任何接近回答此问题。

3 个答案:

答案 0 :(得分:2)

像这样:

    class Base {}
    class Derived : Base {}
    var obj: Base = Derived()
    if obj.dynamicType === Derived.self {
        print("obj is Derived type")
    }

答案 1 :(得分:1)

@ matt的答案适用于Swift 2.0。在swift 3中,您可以简单地执行以下操作:

    class Base {}
    class Derived : Base {}

    var obj: Base = Derived()
    let aClassType = Derived.self

    if type(of: obj) == aClassType {
        print("hey !")
    }

除非===更好。我没有区别。

答案 2 :(得分:0)

我可能有一个解决方案,不需要创建保存的类型的实例。

这个想法是创建一个符合协议 P 的通用结构,里面有一个typealias。然后我们可以创建该结构的实例并将它们传递给一个函数,该函数接受符合 P 的参数,并且可以通过协议中的typealias访问类型。

让我们创建这样的东西:

protocol TypeContainerP {
    typealias type
}

struct TypeContainer<T>: TypeContainerP {
    typealias type = T
}

现在我们可以创建一些使用某些类型参数化的TypeContainer实例:

class A {}
class B {}
let containerA = TypeContainer<A>()
let containerB = TypeContainer<B>()

并创建函数,它将TypeContainerP作为参数,并允许我们通过协议访问类型:

func check<T, E: TypeContainerP>(any: T, _: E) {
    print(any is E.type)
}

我们有:

check(A(), containerA) // true
check(A(), containerB) // false
check(B(), containerA) // false
check(B(), containerB) // true