Search code examples
swiftviper-architecture

Object conforming to a protocol should hide the protocol methods


I have an app designed with Viper architecture. To avoid exeptions, each module is created by a factory class which comply to BaseFactory protocol.

Two of one hundred (2%) modules in my app should be created with a custom factory method which is not enforced via protocol, a factory method which accept an argument.

Is it possible to "hide/disable" a function createViperModule() in the MemberProfileFactory class?

protocol BaseFactory {

    static func createViperModule () -> UIViewController

}

class HelloFactory: BaseFactory {

    static func creatViperModule() -> UIViewController {

        let p = HelloPresenter()
        let storyboard = UIStoryboard.init(name: "Hello", bundle: nil)
        let vc = (storyboard.instantiateInitialViewController() as? HelloVC)!

        p.vc = vc        
        vc.p = p

        return vc
    }
}


class MemberProfileFactory: BaseFactory {

    static func createViperModule() -> UIViewController {

        return PublicProfileVC()
    }

    static func createViperModule(withMember member: MemberModel) -> UIViewController {

        let p = MemberProfilePresenter()
        let storyboard = UIStoryboard.init(name: "MemberProfile", bundle: nil)
        let vc = (storyboard.instantiateInitialViewController() as? MemberProfileVC)!

        p.vc = vc
        p.user = user
        vc.p = p

        return vc
    }
}

Solution

  • You can't make 'createViperModule' private because of 'createViperModule' declared as internal in 'BaseFactory'. but you can declare it optional so it is not mandatory to implement.

    @objc protocol BaseFactory {
        @objc optional static func createViperModule () -> UIViewController
    }