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