Swift 获取对象(Object )类型(Class )
本⽂转载⾃
我们⼀再强调,如果遵循规则的话,Swift 会是⼀门相当安全的语⾔:不会存在类型的疑惑,绝⼤多数的内容应该能在编译期间就唯⼀确定。但是不论是 Objective-C ⾥很多开发者早已习惯的灵活性,还是在程序世界⾥总是千变万化的需求,都不可能保证⼀成不变。我们有时候也需要引⼊⼀定的动态特性。⽽其中最为基本但却是最为有⽤的技巧是获取任意⼀个实例类型。
在 Objective-C 中我们可以轻⽽易举地做到这件事,使⽤-class  ⽅法就可以拿到对象的类,我们甚⾄可以⽤ NSStringFromClass  将它转换为⼀个能够打印出来的字符串:
在 Swift 中,我们会发现不管是纯 Swift 的 class  还是 NSObject  的⼦类,都没有像原来那样的 class() ⽅法来获取类型了。对于NSObject  的⼦类,因为其实类的信息的存储⽅式并没有发⽣什么⼤的变化,因此我们可以求助于 Objective-C 的运⾏时,来获取类并按照原来的⽅式转换:其中object_getClass  是⼀个定义在 ObjectiveC 的 runtime  中的⽅法,它可以接受任意的 AnyObject! 并返回它的类型 AnyClass! (注意这⾥的叹号,它表明我们甚⾄可以输⼊ nil,并期待其返回⼀个 nil)。在 Swift 中其实为了获取⼀个 NSObject  或其⼦类的对象的实际类型,对这个调⽤其实有⼀个好看⼀些的写法,那就是dynamicType 。上⾯的代码⽤⼀种 “更 Swift” ⼀些的语⾔转换⼀下,会是这个样⼦:很好,似乎我们的
问题能解决了。但是仔细想想,我们上⾯⽤的都是 Objective-C 的动态特性,要是换成⼀个 Swift 内建类型的话,会怎么样呢?⽐如原⽣的 String,
可以看到对于 Swift 的原⽣类型,这种⽅式也是可⾏的。(值得指出的是,其实这⾥的真正的类型名字还带有 module 前缀,也就是Swift.String。直接 print 只是调⽤了 CustomStringConvertible 中的相关⽅法⽽已,你可以使⽤ debugPrint 来进⾏确认。关于更多地关于 print 和 debugPrint 的细节,可以参考 print 和 debugPrint ⼀节的内容。)
在 Swift 1.2 之前,直接对 Swift 内建的⾮ AnyObject 类型使⽤ .dynamicType 可能会导致编译错误或者⽆法得到正确结果。但是随着 Swift 不断完善和改进,现在我们已经可以统⼀地使⽤ .dynamicType 来获取⼀个对象的类型了。
备注:dynamicType 在Swift 3.0中已经被舍弃,我们可以使⽤type(of:...)来代替NSDate  *date = [NSDate  date];NSLog (@"%@",NSStringFromClass([date class]));// 输出:// __NSDate
1
2
3
4let  date  = NSDate()let  name: AnyClass ! = object_getClass(date )print(name)// 输出:// __NSDate
1
2
3
45let  date  = NSDate()let  name = date.dynamicType print(name)// 输出:// __NSDate
1
23
4
5let  string  = "Hello"let  name = string .dynamicType print(name)// 输出:// String
1
objectivec和swift2
3
4
5
let  date = NSDate()let  name = type (of :date)print(name)// 输出:// __NSDate 1234
5

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。