我怎样才能得到一个" Any?"变量在Swift中的真实类型

时间:2015-09-25 07:31:05

标签: swift

我从Mirror.children获取属性列表,它返回(label:String?,value:Any)。 我怎样才能获得每种价值的真实类型。

var a: Int = 1
var b: Int? = nil
var c: Any?

c = a
getType(c) -> "Int"

c = b
getType(c) -> "Optional<Int>"

2 个答案:

答案 0 :(得分:1)

您可以查看c.dynamicType

答案 1 :(得分:1)

Metatype Type

  

元类型类型是指任何类型的类型,包括类类型,   结构类型,枚举类型和协议类型。

     

类,结构或枚举类型的元类型是其名称   该类型后跟.Type。协议类型的元类型 - 不是   在运行时符合协议的具体类型是名称   该协议后跟.Protocol。例如,元的类型   类类型SomeClass是SomeClass.Type和元类型   协议SomeProtocol是SomeProtocol.Protocol。

     

您可以使用后缀自我表达式将类型作为值进行访问。   例如,SomeClass.self返回SomeClass本身,而不是实例   SomeClass。并且SomeProtocol.self本身返回SomeProtocol,而不是   在运行时符合SomeProtocol的类型的实例。您   可以使用带有要访问的类型实例的dynamicType表达式   该实例的动态,运行时类型为值,如下所示   示例显示:

class SomeBaseClass {
    class func printClassName() {
        print("SomeBaseClass")
    }
}
class SomeSubClass: SomeBaseClass {
    override class func printClassName() {
        print("SomeSubClass")
    }
}
let someInstance: SomeBaseClass = SomeSubClass()
// The compile-time type of someInstance is SomeBaseClass,
// and the runtime type of someInstance is SomeBaseClass
someInstance.dynamicType.printClassName()
// prints "SomeSubClass
  

使用标识运算符(===和!==)来测试实例是否为   运行时类型与其编译时类型相同。

if someInstance.dynamicType === someInstance.self {
    print("The dynamic type of someInstance is SomeBaseCass")
} else {
    print("The dynamic type of someInstance isn't SomeBaseClass")
}
// prints "The dynamic type of someInstance isn't SomeBaseClass"
  

使用初始化表达式构造一个类型的实例   该类型的元类型值。对于类实例,初始化程序   被调用的必须用必需的关键字或整个标记   标有最终关键字的类。

class AnotherSubClass: SomeBaseClass {
    let string: String
    required init(string: String) {
        self.string = string
    }
    override class func printClassName() {
        print("AnotherSubClass")
    }
}
let metatype: AnotherSubClass.Type = AnotherSubClass.self
let anotherInstance = metatype.init(string: "some string")