在Swift中动态获取AnyObject的类型

时间:2014-08-27 12:11:59

标签: swift

我已将参数传递给AnyObject类型的函数,因为任何东西都可以传递给它。有没有办法动态地传递Object的类型?

4 个答案:

答案 0 :(得分:30)

不清楚你的意思"类型"在你的问题。对于Swift中任何类型的任何值,您可以获得其动态运行时类型:

theVariable.dynamicType

你能用它做什么是另一个问题。

带有@jojodmo提示的Swift 3版本

type(of: theVariable)

答案 1 :(得分:12)

通常这是泛型的用途。在代码中AnyObject没有与ObjC交互的原因很少。如果您根据类型执行不同的操作,那么您实际上可能意味着使用重载。

也就是说,有几种方法可以访问该类型。通常,您希望根据类型运行不同的代码,因此您可以使用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编程语言中进行更多讨论。

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

答案 2 :(得分:0)

首先导入基金会

如果你不想测试类型那样做:

var test1 = "test"

println(_stdlib_getTypeName(test1))

你会得到“TtSS”TtSS意味着字符串。

如果您尝试使用Int,那么它将是TtSi(i for int)

答案 3 :(得分: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")
    }
}