本篇文章給大家分享的是有關(guān)怎么在iOS中實現(xiàn)多繼承與多重代理,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
1. 多繼承
1. 實現(xiàn)過程
swift中的類可以遵守多個協(xié)議,但是只可以繼承一個類,而值類型(結(jié)構(gòu)體和枚舉)只能遵守單個或多個協(xié)議,不能做繼承操作.
多繼承的實現(xiàn):協(xié)議的方法可以在該協(xié)議的extension中實現(xiàn)
protocol Behavior { func run() } extension Behavior { func run() { print("Running...") } } struct Dog: Behavior {} let myDog = Dog() myDog.run() // Running...
無論是結(jié)構(gòu)體還是類還是枚舉都可以遵守多個協(xié)議,所以要實現(xiàn)多繼承,無非就是多遵守幾個協(xié)議的問題.
下面舉個例子.
2. 通過多繼承為UIView擴展方法
// MARK: - 閃爍功能 protocol Blinkable { func blink() } extension Blinkable where Self: UIView { func blink() { alpha = 1 UIView.animate( withDuration: 0.5, delay: 0.25, options: [.repeat, .autoreverse], animations: { self.alpha = 0 }) } } // MARK: - 放大和縮小 protocol Scalable { func scale() } extension Scalable where Self: UIView { func scale() { transform = .identity UIView.animate( withDuration: 0.5, delay: 0.25, options: [.repeat, .autoreverse], animations: { self.transform = CGAffineTransform(scaleX: 1.5, y: 1.5) }) } } // MARK: - 添加圓角 protocol CornersRoundable { func roundCorners() } extension CornersRoundable where Self: UIView { func roundCorners() { layer.cornerRadius = bounds.width * 0.1 layer.masksToBounds = true } } extension UIView: Scalable, Blinkable, CornersRoundable {} cyanView.blink() cyanView.scale() cyanView.roundCorners()
這樣,如果我們自定義了其他View,只需要放大和縮小效果,遵守Scalable協(xié)議就可以啦!
3. 多繼承鉆石問題(Diamond Problem),及解決辦法
請看下面代碼
protocol ProtocolA { func method() } extension ProtocolA { func method() { print("Method from ProtocolA") } } protocol ProtocolB { func method() } extension ProtocolB { func method() { print("Method from ProtocolB") } } class MyClass: ProtocolA, ProtocolB {}
此時ProtocolA和ProtocolB都有一個默認的實現(xiàn)方法method(),由于編譯器不知道繼承過來的method()方法是哪個,就會報錯.
?鉆石問題Diamond Problem,當某一個類或值類型在繼承圖譜中有多條路徑時就會發(fā)生.
解決方法:
1. 在目標值類型或類中重寫那個發(fā)生沖突的方法method().
2. 直接修改協(xié)議中重復的方法.
文章開頭我們提到的問題2,我們可以試著用多重代理去解決這個問題.
2. 多重代理
1. 多重代理的實現(xiàn)過程
我們以一個代理的經(jīng)典問題來表述:
主人叫寵物們?nèi)コ燥?吃這個動作作為一個協(xié)議,我們要做到統(tǒng)一管理.
1. 定義協(xié)議
protocol MasterOrderDelegate: class { func toEat(_ food: String) }
2. 定義一個類: 用來管理遵守協(xié)議的類
這邊用了NSHashTable來存儲遵守協(xié)議的類,NSHashTable和NSSet類似,但又有所不同,總的來說有這幾個特點:
1. NSHashTable中的元素可以通過Hashable協(xié)議來判斷是否相等.
2. NSHashTable中的元素如果是弱引用,對象銷毀后會被移除,可以避免循環(huán)引用.
class masterOrderDelegateManager : MasterOrderDelegate { private let multiDelegate: NSHashTable<AnyObject> = NSHashTable.weakObjects() init(_ delegates: [MasterOrderDelegate]) { delegates.forEach(multiDelegate.add) } // 協(xié)議中的方法,可以有多個 func toEat(_ food: String) { invoke { $0.toEat(food) } } // 添加遵守協(xié)議的類 func add(_ delegate: MasterOrderDelegate) { multiDelegate.add(delegate) } // 刪除指定遵守協(xié)議的類 func remove(_ delegateToRemove: MasterOrderDelegate) { invoke { if $0 === delegateToRemove as AnyObject { multiDelegate.remove($0) } } } // 刪除所有遵守協(xié)議的類 func removeAll() { multiDelegate.removeAllObjects() } // 遍歷所有遵守協(xié)議的類 private func invoke(_ invocation: (MasterOrderDelegate) -> Void) { for delegate in multiDelegate.allObjects.reversed() { invocation(delegate as! MasterOrderDelegate) } } }
3. 其余部分
class Master { weak var delegate: MasterOrderDelegate? func orderToEat() { delegate?.toEat("meat") } } class Dog {} extension Dog: MasterOrderDelegate { func toEat(_ food: String) { print("\(type(of: self)) is eating \(food)") } } class Cat {} extension Cat: MasterOrderDelegate { func toEat(_ food: String) { print("\(type(of: self)) is eating \(food)") } } let cat = Cat() let dog = Dog() let cat1 = Cat() let master = Master() // master的delegate是弱引用,所以不能直接賦值 let delegate = masterOrderDelegateManager([cat, dog]) // 添加遵守該協(xié)議的類 delegate.add(cat1) // 刪除遵守該協(xié)議的類 delegate.remove(dog) master.delegate = delegate master.orderToEat() // 輸出 // Cat is eating meat // Cat is eating meat
以上就是怎么在iOS中實現(xiàn)多繼承與多重代理,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)網(wǎng)站建設公司行業(yè)資訊頻道。
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)建站chinadenli.net,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
網(wǎng)頁名稱:怎么在iOS中實現(xiàn)多繼承與多重代理-創(chuàng)新互聯(lián)
本文網(wǎng)址:http://chinadenli.net/article18/iocgp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、定制網(wǎng)站、ChatGPT、網(wǎng)站維護、微信小程序、小程序開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)