首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何找出对象的类型(在Swift中)?

如何找出对象的类型(在Swift中)?
EN

Stack Overflow用户
提问于 2014-06-08 04:46:23
回答 13查看 241.8K关注 0票数 284

当试图理解一个程序时,或者在某些特殊情况下,找出某些东西是什么类型是很有用的。我知道调试器可以向您显示一些类型信息,您通常可以依靠类型推断在这些情况下不指定类型,但我仍然希望有像Python的type()这样的东西

dynamicType (参见this question)

更新:这在最近的Swift版本中发生了变化,obj.dynamicType现在为您提供了对类型的引用,而不是动态类型的实例。

这个看起来是最有前途的,但到目前为止我还没能找出真正的类型。

代码语言:javascript
复制
class MyClass {
    var count = 0
}

let mc = MyClass()

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

我还尝试使用类引用来实例化一个新对象,它确实起作用了,但奇怪的是,它给我一个错误,告诉我必须添加一个required初始化器:

作品:

代码语言:javascript
复制
class MyClass {
    var count = 0
    required init() {
    }
}

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

然而,对于实际发现任何给定对象的类型来说,仍然只是一小步

编辑:我已经删除了大量现在不相关的细节-如果你感兴趣,请查看编辑历史:)

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2016-10-19 21:27:27

Swift 3版本:

代码语言:javascript
复制
type(of: yourObject)
票数 340
EN

Stack Overflow用户

发布于 2015-10-08 04:08:49

Swift 2.0:

进行这种类型自省的正确方法是使用Mirror struct

代码语言:javascript
复制
    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,如下所示:

代码语言:javascript
复制
    // Prints "String"
    print(stringMirror.subjectType)

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

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

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

然后,您可以使用类似以下内容:

代码语言:javascript
复制
    if anyMirror.subjectType == String.self {
        print("anyObject is a string!")
    } else {
        print("anyObject is not a string!")
    }
票数 112
EN

Stack Overflow用户

发布于 2014-06-08 09:13:14

dynamicType.printClassName代码来自Swift一书中的一个示例。据我所知,没有办法直接获取自定义类名,但您可以使用is关键字检查实例类型,如下所示。这个例子还展示了如何实现一个定制的className函数,如果你真的想要一个字符串形式的类名。

代码语言:javascript
复制
class Shape {
    class func className() -> String {
        return "Shape"
    }
}

class Square: Shape {
    override class func className() -> String {
        return "Square"
    }
}

class Circle: Shape {
    override class func className() -> String {
        return "Circle"
    }
}

func getShape() -> Shape {
    return Square() // hardcoded for example
}

let newShape: Shape = getShape()
newShape is Square // true
newShape is Circle // false
newShape.dynamicType.className() // "Square"
newShape.dynamicType.className() == Square.className() // true

备注:

NSObject的子类已经实现了自己的className函数。如果你正在使用Cocoa,你可以使用这个属性。

代码语言:javascript
复制
class MyObj: NSObject {
    init() {
        super.init()
        println("My class is \(self.className)")
    }
}
MyObj()
票数 60
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24101450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档