你如何找到一个对象的类型(在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 回答
繁星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!") }
一只甜甜圈
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()
- 3 回答
- 0 关注
- 653 浏览
添加回答
举报
0/150
提交
取消