首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift协议重构方法返回协议

Swift协议重构方法返回协议
EN

Stack Overflow用户
提问于 2017-10-24 01:31:58
回答 3查看 116关注 0票数 0

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

+

我希望使用networkXProvider协议注入该服务,例如实现依赖注入(例如,我希望将采用LoginControllerProvider和FetchingUsersFromDBProvider的注入传递给LoginController ):

代码语言:javascript
复制
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()
}

操场发生故障,错误如下:

错误: strings.playground:29:7:错误:类型'Injector‘不符合协议'MyAccountCommunicatorProvider’类喷射器: MyAccountCommunicatorProvider,EventsCommunicatorProvider {^ strings.playground:30:9:注意:候选人具有非匹配类型' NetworkManager‘var networkCommunicator: NetworkManager= NetworkManager() ^ 错误: strings.playground:29:7:错误:类型'Injector‘不符合协议' EventsCommunicatorProvider’类喷射器: MyAccountCommunicatorProvider,EventsCommunicatorProvider{^ strings.playground:30:9:注意:候选人具有非匹配类型' NetworkManager‘var networkCommunicator: NetworkManager= NetworkManager()

环境: swift4,XCode9

EN

回答 3

Stack Overflow用户

发布于 2017-10-24 02:43:38

为什么需要MyAccountCommunicatorProvider和EventsCommunicatorProvider协议?如果你把它们组合成一个呢?

代码语言:javascript
复制
protocol CommunicatorProvider {
 var networkCommunicator: NetworkManager { get }
}

class Injector: CommunicatorProvider {
   var networkCommunicator = NetworkManager()
}
票数 0
EN

Stack Overflow用户

发布于 2017-10-24 04:20:40

代码语言:javascript
复制
    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
    }
}
票数 0
EN

Stack Overflow用户

发布于 2017-10-24 05:52:08

你可以这样使用:

代码语言:javascript
复制
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
    }()
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46900851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档