为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁花不似锦 2019-07-31 18:08:15
你如何找到一个对象的类型(在Swift中)?当试图理解程序时,或者在某些角落情况下,能够真正找出什么类型的东西是有用的。我知道调试器可以显示一些类型信息,你通常可以依赖类型推断来避免在那些情况下不指定类型,但是,我仍然喜欢像Python这样的东西type()dynamicType(查看此问题)更新:这在最近的Swift版本中已经更改,obj.dynamicType现在为您提供类型的引用,而不是动态类型的实例。这个似乎是最有希望的,但到目前为止我还没有找到实际的类型class MyClass {    var count = 0}let mc = MyClass()# update: this now evaluates as truemc.dynamicType === MyClass.self我也尝试使用类引用来实例化一个新对象,这确实有效,但奇怪地给了我一个错误,说我必须添加一个required初始化器:作品:class MyClass {    var count = 0    required init() {    }}let myClass2 = MyClass.selflet mc2 = MyClass2()尽管如此,实际发现任何给定对象的类型仍然只是一小步
查看完整描述

3 回答

?
呼唤远方

TA贡献1856条经验 获得超11个赞

Swift 3版本:

type(of: yourObject)


查看完整回答
反对 回复 2019-07-31
?
繁星coding

TA贡献1797条经验 获得超4个赞

Swift 2.0:

进行这种类型内省的正确方法是使用Mirror结构

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


查看完整回答
反对 回复 2019-07-31
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

dynamicType.printClassName代码是从斯威夫特书的例子。我不知道直接获取自定义类名,但您可以使用is关键字检查实例类型,如下所示。此示例还说明了如果您真的希望将类名称作为字符串,如何实现自定义className函数。

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 // truenewShape is Circle // falsenewShape.dynamicType.className() // "Square"newShape.dynamicType.className() == Square.className() // true

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

class MyObj: NSObject {
    init() {
        super.init()
        println("My class is \(self.className)")
    }}MyObj()


查看完整回答
反对 回复 2019-07-31
  • 3 回答
  • 0 关注
  • 653 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信