国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

談談iOS中的多繼承與多重代理

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

前言

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

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

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

1. 多繼承

1. 實現(xiàn)過程

swift中的類可以遵守多個協(xié)議,但是只可以繼承一個類,而值類型(結構體和枚舉)只能遵守單個或多個協(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...

無論是結構體還是類還是枚舉都可以遵守多個協(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()

iOS,多繼承,多重代理

這樣,如果我們自定義了其他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()方法是哪個,就會報錯.


注:相關教程知識閱讀請移步到IOS開發(fā)頻道。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 金溪县| 获嘉县| 会同县| 榆树市| 东丰县| 马龙县| 承德县| 宜昌市| 渭源县| 阜新市| 平度市| 融水| 五常市| 丹阳市| 喀喇沁旗| 河源市| 康马县| 文昌市| 武功县| 大庆市| 兴宁市| 花莲市| 永城市| 徐闻县| 潜山县| 浮梁县| 鹤岗市| 汝城县| 锡林郭勒盟| 遵义县| 沙雅县| 拉萨市| 冷水江市| 镇原县| 罗田县| 清丰县| 松原市| 榆林市| 宁乡县| 铜川市| 银川市|