你如何找出一个对象的类型(在Swift中)?

前端之家收集整理的这篇文章主要介绍了你如何找出一个对象的类型(在Swift中)?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
当试图理解一个程序,或在某些角落的情况下,它是有用的,能够实际找出什么类型的东西。我知道调试器可以显示一些类型信息,你通常可以依靠类型推理去逃避在这些情况下不指定类型,但仍然,我真的想有一些像python的类型()

dynamicType(见this question)

更新:这已经在最近版本的Swift中更改,obj.dynamicType现在提供了对类型的引用,而不是具有动态类型的实例。

这个似乎是最有前途的,但到目前为止我还没有找到实际的类型

class MyClass {
    var count = 0
}

let mc = MyClass()

# update: this now evaluates as true
mc.dynamicType === MyClass.self

我也尝试使用类引用来实例化一个新的对象,这是工作,但奇怪地给了我一个错误,说我必须添加一个必需的初始化:

作品:

class MyClass {
    var count = 0
    required init() {
    }
}

let myClass2 = MyClass.self
let mc2 = MyClass2()

仍然只有一小步,实际上发现任何给定的对象的类型

编辑:我删除了大量的现在不相关的详细信息 – 看看编辑历史,如果你有兴趣:)

在Swift 2.0中,做这种类型内省的正确方法是用 Mirror struct
let stringObject:String = "testing"
    let stringArrayObject:[String] = ["one","two"]
    let viewObject = UIView()
    let anyObject:Any = "testing"

    let stringMirror = Mirror(reflecting: stringObject)
    let stringArrayMirror = Mirror(reflecting: stringArrayObject)
    let viewMirror = Mirror(reflecting: viewObject)
    let anyMirror = Mirror(reflecting: anyObject)

然后从Mirror结构体访问类型本身,你将使用属性subjectType像这样:

// Prints "String"
    print(stringMirror.subjectType)

    // Prints "Array<String>"
    print(stringArrayMirror.subjectType)

    // Prints "UIView"
    print(viewMirror.subjectType)

    // Prints "String"
    print(anyMirror.subjectType)

然后你可以使用这样的东西:

if anyMirror.subjectType == String.self {
        print("anyObject is a string!")
    } else {
        print("anyObject is not a string!")
    }

猜你在找的Swift相关文章