UIViewController 中的多个初始化步骤问题(不能使用多重继承)

Multiple initialization steps issue in UIViewController (cannot use multiple inheritance)

我正在尝试通过封装在另一个基础中的一些初始化步骤来实现 UIPageViewController class。

由于多重继承在 Swift 中是不可能的,我正在尝试使用协议,但我想触发封装在基 class.

中的一些初始化步骤

Here是我写的base controller

它封装了 Facebook Account Kit 插件以隐藏不应该从我的 child VC 中看到的连接信息(例如导入 AccountKit 指令,AKFAccountKit class 实例)。

当我在标准 class 中使用它时,它起作用了:

class ClientViewController: AccountKitBaseViewController { /*...*/ }
extension ClientViewController: AccountKitBaseViewControllerDelegate {/*...*/}

但是如果我使用 PageVC 作为客户端就不能使用它 class :

class ClientViewController: UIPageViewController, AccountKitBaseViewController { /* Error: Multiple inheritance from classes 'UIPageViewController' and 'AccountKitBaseViewController'*/ }
extension ClientViewController: AccountKitBaseViewControllerDelegate {/*...*/}

我怎样才能做到?

我想建议您将 AccountKitBaseViewController 中的所有逻辑都放到某个助手 class 中,并将此 class 的实例添加到您的控制器中。它将帮助您避免代码重复。您可以使用以下助手class:

class SocialNetworkAssistant {

    //Put here all required propertie from AccountKitBaseViewController
    public var delegate: AccountKitBaseViewControllerDelegate?
    public var isUserLoggedIn: Bool = false
    private var _accountKit: AKFAccountKit!
    private var _pendingLoginViewController: AKFViewController?

    //Put here all required methods from AccountKitBaseViewController
    public func accountKitLogout(completion: (() -> Swift.Void)? = nil) {

        guard isUserLoggedIn == true else { return }

        isUserLoggedIn = false
        _accountKit?.logOut()
        completion?()
    }

    // ... and so on
}

然后您可以将 SocialNetworkAssistant 的实例放入您的控制器中:

class ClientViewControllerFirst : UIViewController, AKFViewControllerDelegate {

    private let socialNetworkAssistantInstance = SocialNetworkAssistant()

    /* AKFViewControllerDelegate methods implementation */
}

class ClientViewControllerSecond : UIPageViewController, AKFViewControllerDelegate {

    private let socialNetworkAssistantInstance = SocialNetworkAssistant()

    /* AKFViewControllerDelegate methods implementation */
}

你也可以使用桥接模式。将 SocialNetworkAssistant 作为将实现 AKFViewControllerDelegate 而不是您的控制器的所有 class 的基础 class。然后,您将在控制器中使用 SocialNetworkAssistant 的不同子 classes。