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

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

当试图理解程序时,或者在某些角落情况下,能够真正找出什么类型的东西是有用的。我知道调试器可以显示一些类型信息,你通常可以依赖类型推断来避免在那些情况下不指定类型,但是,我仍然喜欢像Python这样的东西type()


dynamicType(查看此问题)

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


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


class MyClass {

    var count = 0

}


let mc = MyClass()


# update: this now evaluates as true

mc.dynamicType === MyClass.self

我也尝试使用类引用来实例化一个新对象,这确实有效,但奇怪地给了我一个错误,说我必须添加一个required初始化器:


作品:


class MyClass {

    var count = 0

    required init() {

    }

}


let myClass2 = MyClass.self

let mc2 = MyClass2()

尽管如此,实际发现任何给定对象的类型仍然只是一小步


繁花不似锦
浏览 666回答 3
3回答

呼唤远方

Swift 3版本:type(of: yourObject)

繁星coding

Swift 2.0:进行这种类型内省的正确方法是使用Mirror结构,&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;stringObject:String&nbsp;=&nbsp;"testing" &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;stringArrayObject:[String]&nbsp;=&nbsp;["one",&nbsp;"two"] &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;viewObject&nbsp;=&nbsp;UIView() &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;anyObject:Any&nbsp;=&nbsp;"testing" &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;stringMirror&nbsp;=&nbsp;Mirror(reflecting:&nbsp;stringObject) &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;stringArrayMirror&nbsp;=&nbsp;Mirror(reflecting:&nbsp;stringArrayObject) &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;viewMirror&nbsp;=&nbsp;Mirror(reflecting:&nbsp;viewObject) &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;anyMirror&nbsp;=&nbsp;Mirror(reflecting:&nbsp;anyObject)然后从Mirror结构中访问类型本身,您将使用属性,subjectType如下所示:&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Prints&nbsp;"String"&nbsp;&nbsp;&nbsp;&nbsp;print(stringMirror.subjectType) &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Prints&nbsp;"Array<String>"&nbsp;&nbsp;&nbsp;&nbsp;print(stringArrayMirror.subjectType) &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Prints&nbsp;"UIView"&nbsp;&nbsp;&nbsp;&nbsp;print(viewMirror.subjectType) &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Prints&nbsp;"String"&nbsp;&nbsp;&nbsp;&nbsp;print(anyMirror.subjectType)然后你可以使用这样的东西:&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;anyMirror.subjectType&nbsp;==&nbsp;String.self&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print("anyObject&nbsp;is&nbsp;a&nbsp;string!") &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print("anyObject&nbsp;is&nbsp;not&nbsp;a&nbsp;string!") &nbsp;&nbsp;&nbsp;&nbsp;}

一只甜甜圈

该dynamicType.printClassName代码是从斯威夫特书的例子。我不知道直接获取自定义类名,但您可以使用is关键字检查实例类型,如下所示。此示例还说明了如果您真的希望将类名称作为字符串,如何实现自定义className函数。class&nbsp;Shape&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;func&nbsp;className()&nbsp;->&nbsp;String&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"Shape" &nbsp;&nbsp;&nbsp;&nbsp;}}class&nbsp;Square:&nbsp;Shape&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;override&nbsp;class&nbsp;func&nbsp;className()&nbsp;->&nbsp;String&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"Square" &nbsp;&nbsp;&nbsp;&nbsp;}}class&nbsp;Circle:&nbsp;Shape&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;override&nbsp;class&nbsp;func&nbsp;className()&nbsp;->&nbsp;String&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"Circle" &nbsp;&nbsp;&nbsp;&nbsp;}}func&nbsp;getShape()&nbsp;->&nbsp;Shape&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;Square()&nbsp;//&nbsp;hardcoded&nbsp;for&nbsp;example}let&nbsp;newShape:&nbsp;Shape&nbsp;=&nbsp;getShape()newShape&nbsp;is&nbsp;Square&nbsp;//&nbsp;truenewShape&nbsp;is&nbsp;Circle&nbsp;//&nbsp;falsenewShape.dynamicType.className()&nbsp;//&nbsp;"Square"newShape.dynamicType.className()&nbsp;==&nbsp;Square.className()&nbsp;//&nbsp;true注意:那些子类NSObject已经实现了自己的className函数。如果你正在使用Cocoa,你可以使用这个属性。class&nbsp;MyObj:&nbsp;NSObject&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;init()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.init() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;println("My&nbsp;class&nbsp;is&nbsp;\(self.className)") &nbsp;&nbsp;&nbsp;&nbsp;}}MyObj()
打开App,查看更多内容
随时随地看视频慕课网APP