最近面試了很多人,發(fā)覺大家對(duì)這3個(gè)類型不是很關(guān)注,即是了解的也不清楚什么時(shí)候該用。
是什么
-
AnyObject:所有的class都隱式的實(shí)現(xiàn)了這個(gè)接口。為了兼容OC,原來的id用AnyObject來進(jìn)行替代。 -
Any:范圍更廣,代表除函數(shù)外任何類型的實(shí)例。不僅包含object對(duì)象,還包含基本類型,真正用于Swift中的類型。 -
AnyClass: 屬于AnyObject.Type的別名,表示任意類的元類型 typealias AnyClass = AnyObject.Type
用法
AnyObject本質(zhì)上還是NSObject,所以在Swift中AnyObject應(yīng)該被舍棄,在Swift中應(yīng)該使用Any。
比如:Array<AnyObject>,這個(gè)數(shù)組只能添加OC中對(duì)象,而Swift中結(jié)構(gòu)體、枚舉等是添加不了的。
AnyClass可能有部分人覺得用的很少,其實(shí)不然,如果你的項(xiàng)目耦合度拆分的很好的話是會(huì)用到的。
- Dictional Model解析的時(shí)候,從后端返回的時(shí)候,需要解析成特定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
}
上面代碼只需要傳遞一個(gè)需要解析成的Model類型就可以實(shí)現(xiàn)特定的Model解析。
項(xiàng)目中使用組件化開發(fā)的時(shí)候。
頁面需要返到特定頁面的時(shí)候,我們經(jīng)常會(huì)遇到點(diǎn)擊頁面某個(gè)按鈕去處理一個(gè)流程,等流程處理好了,再返回當(dāng)前頁面。通用的做法一般2種:把需要的返回頁面VC對(duì)象一層一層傳遞下去;用個(gè)通知。
這里我采用第3種方式進(jìn)行跳轉(zhuǎn):
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
}
使用的時(shí)候只需要傳遞需要跳轉(zhuǎn)的AnyClass,比如PointMallsManagerVC.self即可。