Any& AnyObject
- 见到Any ,可以想到 Objectiv-C 中的 id ,在讨论AnyObject之前,Any没有什么好说的, 而AnyObject 又是什么玩意儿呢?
- AnyObject ,可以理解为存在于一个具体对象如(譬如:UILabel、Array、String、NSDate、) 和 Any之间的存在,它既可以窥视到具体对象的方法,又可以用来泛指任意类型对象。一把栗子:
var myObject: AnyObject = UITableViewCell()
myObject = NSData()
let futureDate = myObject.addingTimeInterval(10)
let charOne = myObject.character(at: 5)
let index = myObject.index(of: "hahaha")
let subView = myObject.subviews.first
let key = myObject.allKeys.first
上面这些都是可以编译通过的,可以直观来理解 AnyObject 的效果
- 无聊时 Any 还是 AnyObject 终究不是一个具体的对象,那应该如何进行转换呢? Swift中转换类型有这种:{ let arrV:Array = [“1”,"2","3"] let floatV:CGFloat = CGFloat(arrV.count) } ,还有一种最常用关键字 {as? || as!||as } 那么怎么使用呢,还是上面一段代码,略作调整之后,如果要达到编译不出错的效果就会如此:
var myObject: Any = UITableViewCell()
myObject = NSData()
let futureDate = (myObjectas AnyObject).addingTimeInterval(10)
let charOne = (myObjectas AnyObject).character(at: 5)
let index = (myObjectas AnyObject).index(of: "hahaha")
let subView = (myObjectas AnyObject).subviews.first
let key = (myObjectas AnyObject).allKeys.first
- 通过上面这样子,大概知晓,AnyObject 其实是提供了一个试探性调用方法的机会,当时需要明白,AnyObject对应的对象只有在运行时才能知晓,如果不小心引用了错误的方法,会在运行时候导致崩溃的。如果不能确定使用as关键字装换过去的具体对象确实就是AnyObject接受到的对象,那么最好是用as?判空一下,如果能够确定,那么直接使用as!可矣。譬如
let object2 :AnyObject? = NSClassFromString(className)
if (object2 as? UILabel.Type) != nil {
return .viewTypeLabel
}
- 这里是官方文档的一处简要解释: Interacting with Objective-C APIs
- 如果想要传参数类似 id 这样子的,那么记得使用 Any