Ios 在变量中传递类类型
在swift 2.0中,是否有一种方法可以在变量中传递类的类型,以便我以后可以使用它来检查对象类型是否为该类类型。 通过以下示例更好地解释:Ios 在变量中传递类类型,ios,swift,Ios,Swift,在swift 2.0中,是否有一种方法可以在变量中传递类的类型,以便我以后可以使用它来检查对象类型是否为该类类型。 通过以下示例更好地解释: class Base {..} class Derived : Base {..} var obj: Base = Derived() if obj is Derived { print("obj is Derived type") } 这很好。但我希望能够将类类型“派生”存储在变量中,如下所示: let classType = Derived
class Base {..}
class Derived : Base {..}
var obj: Base = Derived()
if obj is Derived {
print("obj is Derived type")
}
这很好。但我希望能够将类类型“派生”存储在变量中,如下所示:
let classType = Derived // Of course this will give compile error
然后使用它检查对象的类型:
if obj is classType {..}
我最接近于保存类类型的方法是:
let classType = Derived.self
这表示类类型是“派生的.type”类型,但您不能真正使用它来检查对象类型,如下所示:
if obj is classType {..blah.. } // Compile error.'Use of undeclared type 'classType'
我希望你明白我的意思。我试图将类类型存储在一个变量中,然后使用该变量检查对象是否属于该类型。
有办法吗。
我看了类似的关于stack overflow的论坛,但没有什么能回答这个问题 像这样:
class Base {}
class Derived : Base {}
var obj: Base = Derived()
if obj.dynamicType === Derived.self {
print("obj is Derived type")
}
我可能有一个解决方案,它不需要创建保存类型的实例 其思想是创建一个符合协议p的通用结构,其中包含一个typealias。然后,我们可以创建该结构的实例并将它们传递给函数,该函数接受符合P的参数,并且可以通过协议中的typealias访问类型 让我们创建如下内容:
protocol TypeContainerP {
typealias type
}
struct TypeContainer<T>: TypeContainerP {
typealias type = T
}
@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 !")
}
除非===更好。我看不出有什么不同。新版本的swift 2似乎不支持obj.dynamicType。0@Feru真正地那会弄乱我的很多代码(我试着在Playway中调用时出现了一个错误“type'Base'的值没有成员'dynamicType'”@Feru在Xcode 7.1 beta 3中工作得很好;他们在最后一分钟更改了吗???我向您保证,我提供的代码在7.1 beta 3中编译并正常工作。对不起,我现在没有时间下载7.1 final并再次测试。
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
class Base {}
class Derived : Base {}
var obj: Base = Derived()
let aClassType = Derived.self
if type(of: obj) == aClassType {
print("hey !")
}