Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在变量中传递类类型_Ios_Swift - Fatal编程技术网

Ios 在变量中传递类类型

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

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

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 !")
    }