最近面试了很多人,发觉大家对这3个类型不是很关注,即是了解的也不清楚什么时候该用。
是什么
-
AnyObject
:所有的class都隐式的实现了这个接口。为了兼容OC,原来的id用AnyObject来进行替代。 -
Any
:范围更广,代表除函数外任何类型的实例。不仅包含object对象,还包含基本类型,真正用于Swift中的类型。 -
AnyClass
: 属于AnyObject.Type的别名,表示任意类的元类型 typealias AnyClass = AnyObject.Type
用法
AnyObject本质上还是NSObject,所以在Swift中AnyObject应该被舍弃,在Swift中应该使用Any
。
比如:Array<AnyObject>,这个数组只能添加OC中对象,而Swift中结构体、枚举等是添加不了的。
AnyClass可能有部分人觉得用的很少,其实不然,如果你的项目耦合度拆分的很好的话是会用到的。
- Dictional Model解析的时候,从后端返回的时候,需要解析成特定Model使用。
public func mapModel<T: BaseModel>(_ type: T.Type) throws -> T {
let model = BaseModel.parseDictionaryModel(self, modelClass: type)
guard let goodModel = model as? T else {
throw RxCocoaError.unknown
}
return goodModel
}
上面代码只需要传递一个需要解析成的Model类型就可以实现特定的Model解析。
项目中使用组件化开发的时候。
页面需要返到特定页面的时候,我们经常会遇到点击页面某个按钮去处理一个流程,等流程处理好了,再返回当前页面。通用的做法一般2种:把需要的返回页面VC对象一层一层传递下去;用个通知。
这里我采用第3种方式进行跳转:
public class func popToTheViewControllerType(_ vcType: AnyClass) -> UIViewController? {
if let nvc = getCurrentNav() {
for temp: UIViewController in nvc.viewControllers {
if type(of: temp) == vcType {
nvc.popToViewController(temp, animated: true)
return temp
}
}
}
return nil
}
使用的时候只需要传递需要跳转的AnyClass,比如PointMallsManagerVC.self即可。