真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

分析iOS中的多繼承與多重代理-創(chuàng)新互聯(lián)

這篇文章主要介紹“分析iOS中的多繼承與多重代理”,在日常操作中,相信很多人在分析iOS中的多繼承與多重代理問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”分析iOS中的多繼承與多重代理”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、重慶小程序開(kāi)發(fā)公司、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了巴里坤哈薩克免費(fèi)建站歡迎大家使用!

1. 多繼承

1. 實(shí)現(xiàn)過(guò)程

swift中的類可以遵守多個(gè)協(xié)議,但是只可以繼承一個(gè)類,而值類型(結(jié)構(gòu)體和枚舉)只能遵守單個(gè)或多個(gè)協(xié)議,不能做繼承操作.

多繼承的實(shí)現(xiàn):協(xié)議的方法可以在該協(xié)議的extension中實(shí)現(xiàn)

protocol Behavior { func run()}extension Behavior { func run() {  print("Running...") }}struct Dog: Behavior {}let myDog = Dog()myDog.run() // Running...

無(wú)論是結(jié)構(gòu)體還是類還是枚舉都可以遵守多個(gè)協(xié)議,所以要實(shí)現(xiàn)多繼承,無(wú)非就是多遵守幾個(gè)協(xié)議的問(wèn)題.

下面舉個(gè)例子.

2. 通過(guò)多繼承為UIView擴(kuò)展方法

// 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. 多繼承鉆石問(wèn)題(Diamond Problem),及解決辦法

請(qǐng)看下面代碼

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 {}

此時(shí)ProtocolA和ProtocolB都有一個(gè)默認(rèn)的實(shí)現(xiàn)方法method(),由于編譯器不知道繼承過(guò)來(lái)的method()方法是哪個(gè),就會(huì)報(bào)錯(cuò).

?鉆石問(wèn)題Diamond Problem,當(dāng)某一個(gè)類或值類型在繼承圖譜中有多條路徑時(shí)就會(huì)發(fā)生.

解決方法:

1. 在目標(biāo)值類型或類中重寫(xiě)那個(gè)發(fā)生沖突的方法method().

2. 直接修改協(xié)議中重復(fù)的方法.

文章開(kāi)頭我們提到的問(wèn)題2,我們可以試著用多重代理去解決這個(gè)問(wèn)題.

2. 多重代理

1. 多重代理的實(shí)現(xiàn)過(guò)程

我們以一個(gè)代理的經(jīng)典問(wèn)題來(lái)表述:

主人叫寵物們?nèi)コ燥?吃這個(gè)動(dòng)作作為一個(gè)協(xié)議,我們要做到統(tǒng)一管理.

1. 定義協(xié)議

protocol MasterOrderDelegate: class {  func toEat(_ food: String)}

2. 定義一個(gè)類: 用來(lái)管理遵守協(xié)議的類

這邊用了NSHashTable來(lái)存儲(chǔ)遵守協(xié)議的類,NSHashTable和NSSet類似,但又有所不同,總的來(lái)說(shuō)有這幾個(gè)特點(diǎn):

1. NSHashTable中的元素可以通過(guò)Hashable協(xié)議來(lái)判斷是否相等.

2. NSHashTable中的元素如果是弱引用,對(duì)象銷毀后會(huì)被移除,可以避免循環(huán)引用.

class masterOrderDelegateManager : MasterOrderDelegate {  private let multiDelegate: NSHashTable = NSHashTable.weakObjects()  init(_ delegates: [MasterOrderDelegate]) {    delegates.forEach(multiDelegate.add)  }  // 協(xié)議中的方法,可以有多個(gè)  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 = delegatemaster.orderToEat()// 輸出// Cat is eating meat// Cat is eating meat

設(shè)置masterOrderDelegateManager的好處是,可以通過(guò)一個(gè)數(shù)組來(lái)管理多重代理.

更多iOS相關(guān)知識(shí)點(diǎn)歡迎關(guān)注我的Github: SwiftTips(本地下載)

到此,關(guān)于“分析iOS中的多繼承與多重代理”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!


文章名稱:分析iOS中的多繼承與多重代理-創(chuàng)新互聯(lián)
鏈接地址:http://weahome.cn/article/depcje.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部