国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 万全县| 澜沧| 阿拉善右旗| 水富县| 辛集市| 北川| 平利县| 新余市| 雅江县| 克拉玛依市| 张家口市| 永德县| 梅河口市| 郧西县| 星子县| 广安市| 怀化市| 怀远县| 唐海县| 海南省| 伊川县| 邢台市| 通化市| 合山市| 普格县| 白山市| 沁源县| 南康市| 潍坊市| 临沂市| 禹州市| 翼城县| 海口市| 承德县| 南澳县| 青神县| 广西| 肥乡县| 呼图壁县| 旌德县| 邵阳县|