Swift之Any、AnyClass、AnyObject

最近面試了很多人,發(fā)覺大家對(duì)這3個(gè)類型不是很關(guān)注,即是了解的也不清楚什么時(shí)候該用。

是什么

  1. AnyObject:所有的class都隱式的實(shí)現(xiàn)了這個(gè)接口。為了兼容OC,原來的id用AnyObject來進(jìn)行替代。
  2. Any:范圍更廣,代表除函數(shù)外任何類型的實(shí)例。不僅包含object對(duì)象,還包含基本類型,真正用于Swift中的類型。
  3. 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ì)用到的。

  1. 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解析。

  1. 項(xiàng)目中使用組件化開發(fā)的時(shí)候。

  2. 頁面需要返到特定頁面的時(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即可。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容