我已经向一个类型为AnyObject的函数传递了一个参数,因为任何东西都可以被传递给它。有没有一种动态获取传递对象类型的方法?
我已经向一个类型为AnyObject的函数传递了一个参数,因为任何东西都可以被传递给它。有没有一种动态获取传递对象类型的方法?
您在问题中提到的“类型”不是很清楚。在Swift中,对于任何类型的任何值,您都可以像这样获取其动态运行时类型:
theVariable.dynamicType
你可以做什么是另一个问题。
@jojodmo 提供的 Swift 3 版本提示:
type(of: theVariable)
type(of: theVariable)
。 - Jojodmo通常这就是泛型的用途。如果代码不与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代码,否则很少需要使用Any
或AnyObject
。在Swift中,泛型和重载是用于解决这些问题的工具。
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")
}
}
首先导入Foundation
如果你想要test1的类型,可以这样做:
var test1 = "test"
println(_stdlib_getTypeName(test1))