获取对象类型

获取对象类型

由 王巍 (@ONEVCAT) 发布于 2015/05/27

我们一再强调,如果遵循规则的话,Swift 会是一门相当安全的语言:不会存在类型的疑惑,绝大多数的内容应该能在编译期间就唯一确定。但是不论是 Objective-C 里很多开发者早已习惯的灵活性,还是在程序世界里总是千变万化的需求,都不可能保证一尘不变。我们有时候也需要引入一定的动态特性。而其中最为基本但却是最为有用的技巧是获取任意一个实例类型。

在 Objective-C 中我们可以轻而易举地做到这件事,使用 -class 方法就可以拿到对象的类,我们甚至可以用 NSStringFromClass 将它转换为一个能够打印出来的字符串:

NSDate *date = [NSDate date];
NSLog(@"%@",NSStringFromClass([date class]));
// 输出:
// __NSDate

在 Swift 中,我们会发现不管是纯 Swift 的 class 还是 NSObject 的子类,都没有像原来那样的 class() 方法来获取类型了。对于 NSObject 的子类,因为其实类的信息的存储方式并没有发生什么大的变化,因此我们可以求助于 Objective-C 的运行时,来获取类并按照原来的方式转换:

let date = NSDate()
let name: AnyClass! = object_getClass(date)
println(name)
// 输出:
// __NSDate

其中 object_getClass 是一个定义在 ObjectiveC 的 runtime 中的方法,它可以接受任意的 AnyObject! 并返回它的类型 AnyClass! (注意这里的叹号,它表明我们甚至可以输入 nil,并期待其返回一个 nil)。在 Swift 中其实为了获取一个 NSObject 或其子类的对象的实际类型,对这个调用其实有一个好看一些的写法,那就是 dynamicType。上面的代码用一种 "更 Swift" 一些的语言转换一下,会是这个样子:

let date = NSDate()
let name = date.dynamicType
println(name)
// 输出:
// __NSDate

很好,似乎我们的问题能解决了。但是仔细想想,我们上面用的都是 Objective-C 的动态特性,要是换成一个 Swift 内建类型的话,会怎么样呢?比如原生的 String

let string = "Hello"
let name = string.dynamicType
println(name)
// 输出:
// Swift.String

可以看到对于 Swift 的原生类型,这种方式也是可行的。

在 Swift 1.2 之前,直接对 Swift 内建的非 AnyObject 类型使用 `.dynamicType` 可能会导致编译错误或者无法得到正确结果。但是随着 Swift 不断完善和改进,现在我们已经可以统一地使用 `.dynamicType` 来获取一个对象的类型了。

时间: 2024-10-16 10:18:31

获取对象类型的相关文章

获取对象类型(swift)

获取对象类型(swift) by 伍雪颖 let date = NSDate() let name = date.dynamicType println(name) let string = "Hello" let name1 = string.dynamicType println(name1)

flex获取对象类型 并通过类名实例化对象

问题情景描述: 平台A.B,分别对应主内容区Hgroup的子对象,对象类型相同,只是数据不同. 当A.B之间切换,Hgroup的对象需要重新创建并数据赋值. 这样便出现了 获取对象类型  并创建该类型对象实例 的需求. 问题解决方法: step1 : 根据对象获取对象类型 使用getQualifiedClassName方法,可以返回类型String step2:创建该类型对象实例 getDefinitionByName根据对象类型String,得到CLass类.然后对类进行实例化即可. 代码参考

python Class:获取对象类型

获取对象类型: 一.type #!/usr/bin/env python3# -*- coding: utf-8 -*- class Animal(object):    def __init__(self, name, score):        self.name = name        self.score = score    def run(self):        print 'Animal is run' class Dog(Animal):    def run(self

获取对象信息

#当我们调用方法时可能需要传递一个参数,这个参数类型我们知道,但是对于接收参数的方法,就不一定知道是什么参数类型了.我们该如何得知参数类型呢? #Python为我们提供了以下3种获取对象类型的方法. 1.使用type()函数 #前面已经学过type()函数的使用,基本类型都可以用type()判断,例如: 1 >>> type(123) 2 <class 'int'> 3 >>> type('abc') 4 <class 'str'> 5 >

Java获取未知类型对象的属性

获取未知类型对象的属性通常有两种方式: 一是通过自定义注解的方式,通过获取被注解的属性从而获取属性的值,这种方式也是Spring参数注入的重要实现手段 二是通过反射获取属性的名称,通过属性名从而获取属性,这种方式在开发时是比较简便易实现的. 一.关于注解 1.自定义注解 首先定义一个@interface类型的注解接口 @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface ClassBean

java获取对象属性类型、属性名称、属性值

因为项目需要用到,于是简单封装了一些常用的操作: [java] view plaincopy /** * 根据属性名获取属性值 * */ private Object getFieldValueByName(String fieldName, Object o) { try { String firstLetter = fieldName.substring(0, 1).toUpperCase(); String getter = "get" + firstLetter + field

获取对象的类型信息 (JavaScript)

function classof(o) { if (null == o) return 'Null'; if (undefined == o) return 'Undefined'; return Object.prototype.toString.call(o).slice(8, -1); } classof([]); classof({}); classof(Date); classof(new Date()); classof(/./); classof(1); classof(1.9);

JQuery获取对象标签类型

通过JQuery的selector,我们很容易的获取了对象.但是,如果想知道对象类型,进行不同的操作,该如何获取对象标签类型呢? $JQueryObject.prop("tagName"); 或者仅仅是判断类型 $JQueryObject.is("TR");//如果是<tr />返回true,否则返回false. 如果使用原生DOM选择器,还可以这样: document.getElementById("targetId").tagNa

通过反射获取列表属性里保存的对象类型

假设有个对象里有一个list<Object> listProperty 属性,要获取Object的类型: Class<?> typeClass = field.getType(); if (List.class.isAssignableFrom(typeClass)) { Type fieldType = field.getGenericType(); if (fieldType instanceof ParameterizedType) { ParameterizedType p