麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 系統(tǒng) > iOS > 正文

談?wù)刬OS中的多繼承與多重代理

2019-10-21 18:39:30
字體:
供稿:網(wǎng)友

前言

多繼承和多重代理在swift的語言層面上是不支持的,但我們有時(shí)會(huì)遇到這樣的問題:

  • 類B和C分別繼承自A,B1和B2繼承自B,C1和C2繼承自C.現(xiàn)在我們需要在B1和C1中添加相同的方法,怎么去做?使用繼承的話只能在類A中添加,但這樣做的結(jié)果是基類A會(huì)越來越臃腫,最后變成上帝類God Class,維護(hù)起來會(huì)很困難.
  • 在實(shí)現(xiàn)完某個(gè)代理后發(fā)現(xiàn),我們還要在其他頁面中獲取數(shù)據(jù).例如,IM消息接收之后要在多個(gè)地方做回調(diào),比如顯示消息內(nèi)容頁面,改變小紅點(diǎn),顯示消息數(shù).即一對(duì)多的模式,我們第一反應(yīng)是用通知,但通知還是能少用就少用,用多了代碼的可閱讀性會(huì)大大降低.

面對(duì)第一種情況,最好的解決方法是,B1和C1的公共方法專門封裝到一個(gè)地方,需要的時(shí)候就調(diào)用一下,多繼承就是一個(gè)最好的解決方案.

1. 多繼承

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

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...

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

下面舉個(gè)例子.

2. 通過多繼承為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()

iOS,多繼承,多重代理

這樣,如果我們自定義了其他View,只需要放大和縮小效果,遵守Scalable協(xié)議就可以啦!

3. 多繼承鉆石問題(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(),由于編譯器不知道繼承過來的method()方法是哪個(gè),就會(huì)報(bào)錯(cuò).


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到IOS開發(fā)頻道。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 狠狠干91| 亚洲午夜在线视频 | 黄在线观看| 久久毛片免费观看 | 亚洲一区二区三区91 | 91嫩草丨国产丨精品入口 | 99re热精品视频 | 欧美亚成人 | 久久激情免费视频 | 国产色爱综合网 | 国产精品久久久久久久久久久久久久久 | 第四色成人网 | 欧美国产一区二区三区 | 欧美一级免费高清 | 欧美日韩成人一区二区 | 国产精品一区二区手机在线观看 | 好骚综合在线 | 日产精品一区二区三区在线观看 | 中午字幕无线码一区2020 | 黄色网址电影 | 久久久三级免费电影 | 黄片毛片一级 | 国产无遮挡一区二区三区毛片日本 | 亚洲精久 | 欧美在线观看视频一区 | 国产一级免费视频 | 毛片大全在线观看 | 在线观看麻豆 | 日韩毛片网 | 国产午夜精品一区二区三区嫩草 | 国产成人免费高清激情视频 | free japan xxxxhdsex69 | 国产亚洲精品综合一区91555 | 中文字幕免费看 | 成人店女老板视频在线看 | 免费国产一区二区视频 | 毛片视频网址 | 成人做爰高潮片免费视频韩国 | 免费久久久 | 欧美性生交zzzzzxxxxx | 羞羞的小视频 |