這篇文章主要介紹“分析iOS中的多繼承與多重代理”,在日常操作中,相信很多人在分析iOS中的多繼承與多重代理問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”分析iOS中的多繼承與多重代理”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計、網(wǎng)站制作、外貿(mào)營銷網(wǎng)站建設(shè)服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)天河免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上千余家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎ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,當(dāng)某一個類或值類型在繼承圖譜中有多條路徑時就會發(fā)生.
解決方法:
1. 在目標值類型或類中重寫那個發(fā)生沖突的方法method().
2. 直接修改協(xié)議中重復(fù)的方法.
文章開頭我們提到的問題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
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 = delegatemaster.orderToEat()// 輸出// Cat is eating meat// Cat is eating meat
設(shè)置masterOrderDelegateManager的好處是,可以通過一個數(shù)組來管理多重代理.
更多iOS相關(guān)知識點歡迎關(guān)注我的Github: SwiftTips(本地下載)
到此,關(guān)于“分析iOS中的多繼承與多重代理”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
文章題目:分析iOS中的多繼承與多重代理
轉(zhuǎn)載源于:http://weahome.cn/article/ppccgs.html