【问题标题】:Multiple inheritance from custom UIViewController and CocoaPods library来自自定义 UIViewController 和 CocoaPods 库的多重继承
【发布时间】:2018-09-03 11:04:35
【问题描述】:

我有两个自定义 UIViewController,第二个从第一个扩展如下 UIViewController

现在我想在一个新控制器中使用XLPagerTabStrip,我希望它从 CustomVC2 和 XLPagerTabStrip 继承,但是 Swift 不允许多重继承,我需要它们的一些函数和属性。

我的第一种方法是让我所有的自定义 VC 都继承自 XLPagerTabStrip,但我不想仅仅因为我需要在一个控制器中添加额外的功能。

我的第二种方法是派生该库并使其继承自我的 CustomVC2 而不是 UIViewController,但是我必须保持与该库的兼容性。

我相信应该有人遇到过同样的问题,我该如何解决这个问题?

【问题讨论】:

  • 使用委托。 Swift 中的委托是一种间接实现多重继承的方法。
  • 你能举一个例子说明你的 XLPagerTabStrip 子类想从 CustomVC2 中使用什么吗?
  • @Ray_Soham 你能举个例子吗?
  • @crom87 例如传回数据的方式,通用自定义导航项在 CustomVC2 中设置,我宁愿不重复代码..

标签: ios swift inheritance uiviewcontroller


【解决方案1】:

实现这一点的一种方法是将尽可能多的功能提取到协议扩展中,然后在适用的情况下调用方法。

例如:

protocol SomeFunctionality {
    func doSomething()
}

extension SomeFunctionality {
    func doSomething() {
        // call api, or whatever else
    }
}

如果你在 doSomething() 中需要 UIViewController 特定的东西,你可以像这样约束扩展:

extension SomeFunctionality where Self: UIViewController {
    //... now you have access to self.view and those things
}

您还可以约束 Self 以采用其​​他协议以一次提供更多功能的默认实现。

这样,您只需在子类中的任何需要的地方调用 doSomething()。

【讨论】:

  • 这可以在Objective-C中以同样的方式实现吗?我的 CustomVC1 在 Objective-C 中,在 Swift 中是第二个
  • 协议扩展(尤其是 where 子句)是一件快速的事情。对于 objc,您将使用类别扩展,它与类类似但与类相关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 2018-01-19
相关资源
最近更新 更多