【问题标题】:Swift protocol requring method returning protocolsSwift 协议要求方法返回协议
【发布时间】:2017-10-24 01:31:58
【问题描述】:

我正在尝试编译以下代码。 基本上我希望对象符合多种协议,例如将不同组 API 暴露给应用程序不同部分的网络服务(例如:登录 API 到 loginController,共享 API 到 shareController)

+

我希望使用 networkXProvider 协议注入此服务,例如实现依赖注入(例如我想向 LoginController 传递一个采用 LoginControllerProvider 和 FetchingUsersFromDBProvider 的注入):

protocol MyAccountCommunicator {
    func getAccountData() -> String
}

protocol EventsCommunicator {
    func getEvents() -> String
}


 class NetworkManager: MyAccountCommunicator, EventsCommunicator {
    func getAccountData() -> String {
        return "Accounts"
    }

    func getEvents() -> String {
        return "Events"
    }
}

protocol MyAccountCommunicatorProvider {
    var networkCommunicator: MyAccountCommunicator { get }
}


protocol EventsCommunicatorProvider {
    var networkCommunicator: EventsCommunicator { get }
}

class Injector: MyAccountCommunicatorProvider, EventsCommunicatorProvider {
    var networkCommunicator: NetworkManager = NetworkManager()
}

Playground 失败并出现以下错误:

错误:strings.playground:29:7:错误:类型“注射器”没有 符合协议'MyAccountCommunicatorProvider'类注入器: MyAccountCommunicatorProvider,EventsCommunicatorProvider { ^

strings.playground:30:9: 注意:候选人的类型不匹配 '网络管理员' var networkCommunicator: NetworkManager = NetworkManager() ^

错误:strings.playground:29:7:错误:类型“注射器”没有 符合协议'EventsCommunicatorProvider'类注入器: MyAccountCommunicatorProvider,EventsCommunicatorProvider { ^

strings.playground:30:9: 注意:候选人的类型不匹配 '网络管理员' var networkCommunicator: NetworkManager = NetworkManager()

环境:swift4、XCode9

【问题讨论】:

    标签: swift dependency-injection protocols


    【解决方案1】:

    为什么需要 MyAccountCommunicatorProvider 和 EventsCommunicatorProvider 协议?如果将它们合二为一呢?

    protocol CommunicatorProvider {
     var networkCommunicator: NetworkManager { get }
    }
    
    class Injector: CommunicatorProvider {
       var networkCommunicator = NetworkManager()
    }
    

    【讨论】:

    • 感谢您的提问,我已经更新了初始问题的文本,因此可能更容易理解我想要实现的目标
    【解决方案2】:
        protocol MyAccountCommunicator {
        func getAccountData() -> String
    }
    
    protocol EventsCommunicator {
        func getEvents() -> String
    }
    
    protocol MyAccountCommunicatorProvider {
        var accountCommunicator: MyAccountCommunicator { get }
    }
    
    protocol EventsCommunicatorProvider {
        var eventCommunicator: EventsCommunicator { get }
    }
    
    class NetworkManager: MyAccountCommunicator, EventsCommunicator {
        func getAccountData() -> String {
            return "Accounts"
        }
    
        func getEvents() -> String {
            return "Events"
        }
    }
    
    class Injector: MyAccountCommunicatorProvider, EventsCommunicatorProvider {
        var networkManager = NetworkManager()
        var accountCommunicator: MyAccountCommunicator {
            return networkManager
        }
    
        var eventCommunicator: EventsCommunicator {
            return networkManager
        }
    }
    

    【讨论】:

    • 谢谢,这是一个解决方案,但重点是能够返回完整的对象,而无需为每个协议创建方法
    【解决方案3】:

    你可以这样使用:

    protocol MyAccountCommunicatorProvider {
        var networkCommunicator1: MyAccountCommunicator { get }
    }
    
    protocol EventsCommunicatorProvider {
        var networkCommunicator2: EventsCommunicator { get }
    }
    
    class Injector: MyAccountCommunicatorProvider, EventsCommunicatorProvider {
        var networkCommunicator: NetworkManager = NetworkManager()
        lazy var networkCommunicator1: MyAccountCommunicator = {
            return networkCommunicator
        }()
        lazy var networkCommunicator2: EventsCommunicator = {
            return networkCommunicator
        }()
    }
    

    【讨论】:

    • 谢谢,这是一个解决方案,但重点是能够返回完整的对象,而无需为每个协议创建方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多