【问题标题】:Get the type of AnyObject dynamically in Swift在 Swift 中动态获取 AnyObject 的类型
【发布时间】:2014-08-27 12:11:59
【问题描述】:

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

【问题讨论】:

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

标签: swift


【解决方案1】:

不清楚您的问题中的“类型”是什么意思。对于 Swift 中任何类型的任何值,您都可以像这样获取它的动态运行时类型:

theVariable.dynamicType

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

带有@jojodmo 提示的Swift 3 版本:

type(of: theVariable)

【讨论】:

  • 这应该是这个问题的答案。
  • 在 Swift 3 中,已更改为 type(of: theVariable)
【解决方案2】:

通常这就是泛型的用途。在不与 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 中用来解决这些问题的工具。

【讨论】:

    【解决方案3】:

    首先导入基础

    如果您不想使用 test1 的类型,请这样做:

    var test1 = "test"
    
    println(_stdlib_getTypeName(test1))
    

    你会得到 "TtSS" TtSS 意思是字符串。

    如果你想用 Int 试试,那就是 TtSi(i 代表 int)

    【讨论】:

    • 请记住,这些类型名称是私有的,随时可能更改。函数名称中的前导下划线是来自 Apple 的指示,表明这是一个不打算从标准库外部调用的内部函数。
    【解决方案4】:
    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")
        }
    }
    

    【讨论】:

    • 请添加一些解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 1970-01-01
    相关资源
    最近更新 更多