在Swift中动态获取AnyObject的类型

15

我已经向一个类型为AnyObject的函数传递了一个参数,因为任何东西都可以被传递给它。有没有一种动态获取传递对象类型的方法?


我想说,在这个话题中没有一个答案能够帮助到我。我的问题是在调试期间无法获取类型信息,以了解如何处理Any对象并查看实际内容,因为我不知道Any对象的类型,也不知道需要将其转换为哪种类型才能查看内容。 对我来说最好的解决方案是将Any对象转换为NSObject,并查看它的className属性,例如: ((json["glossary"] as NSDictionary)["title"] as NSObject).className 它会显示“__NSDictionaryM”,例如: - Pasha
4个回答

31

您在问题中提到的“类型”不是很清楚。在Swift中,对于任何类型的任何值,您都可以像这样获取其动态运行时类型:

theVariable.dynamicType

你可以做什么是另一个问题。

@jojodmo 提供的 Swift 3 版本提示:

type(of: theVariable)

这应该是这个问题的答案。 - Błażej
9
在Swift 3中,它已更改为 type(of: theVariable) - Jojodmo

13

通常这就是泛型的用途。如果代码不与ObjC交互,则很少有充分的理由使用AnyObject。如果您根据类型执行不同的操作,那么您可能实际上是想要使用重载。

话虽如此,有几种方法可以访问类型。通常您希望根据类型运行不同的代码,因此可以使用switch

let x:AnyObject = "asdf"
switch x {
case is String: println("I'm a string")
default: println("I'm not a string")
}
或者
let x:AnyObject = "asdf"
switch x {
case let xString as String: println("I'm a string: \(xString)")
default: println("I'm not a string")
}

或者您可以使用一个if语句:

if let string = x as? String {
  println("I'm a string: \(string)")
}

查看Swift编程语言中的“Any和AnyObject的类型转换”以获取更多讨论。

但是,除非您正在使用ObjC代码,否则很少需要使用AnyAnyObject。在Swift中,泛型和重载是用于解决这些问题的工具。


0
func testType(value:AnyObject!){

    if let v = value as? NSString{

        println("NSString")

    }else if let v = value as? NSNumber{

        println("NSNumber")

    }else if let v = value as? Double{

        println("Double")

    }else if let v = value as? Int{
        println("Int")
    }
}

请添加一些解释。 - Mohit Jain

0

首先导入Foundation

如果你想要test1的类型,可以这样做:

var test1 = "test"

println(_stdlib_getTypeName(test1))

你会得到"TtSS",其中TtSS代表字符串。
如果你尝试使用整数,它将是TtSi(i代表int)。

1
请注意,这些类型名称是私有的,并且随时可能更改。函数名中的下划线表示这是 Apple 的内部函数,不应从 stdlib 外部调用。 - Rob Napier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接