swift - 相同的协议(protocol)对象,但功能不同

标签 swift design-patterns

我正在尝试构建一个 API 模式。

我有几个不同的 API,其中一些具有相同的功能,还有一些具有其他 API 没有且不应访问的附加功能。

协议(protocol)的问题在于它们都具有访问权限。如果函数未被覆盖,如何限制访问?

api请求:

class APIRequest {
    static func loginCli(completion: (UserClinic) -> ()) {

    }

    static func loginFami(completion: (User) -> ()) {

    }

    static func loginDavid(completion: (UserDavid) -> ()) {

    }
}

协议(protocol)和API:

protocol API {
    func login<T>(completion: (T) -> ())
    func saveClient()
}

extension API {
    func saveClient() {
        saveClient()
    }
}

class FirstAPI: API {
    func login<T>(completion: (T) -> ()) {
        APIRequest.loginFami { (user) in

        }
    }
}

class SecondAPI: API {
    func login<T>(completion: (T) -> ()) {
        APIRequest.loginCli { (user) in

        }
    }
}

class ThreeAPI: API {
    func login<T>(completion: (T) -> ()) {
        APIRequest.loginDavid { (user) in

        }
    }

    func saveClient() {
        // Save client
    }
}

查看模型:

class LoginViewModel {
    var apiClient: API

    init() {
        // Below its good
        apiClient = ThreeAPI()
        apiClient.saveClient()

        // Below its not good
        apiClient = FirstAPI()
        apiClient.saveClient() // I want this is not accessible

        // Below its good
        apiClient = SecondAPI()
        apiClient.saveClient() // I want this is not accessible
    }
}

就我而言,我只需要第三个 API 即可访问函数 saveClient()

最佳答案

如果您不希望在 FirstAPISecondAPI 上使用 saveClient 方法,则需要将该方法提取到单独的协议(protocol)中。像这样的东西:

protocol APIThatCanLogin {
    func login<T>(completion: (T) -> ())
}

protocol APIThatCanSave {
    func saveClient()
}


class FirstAPI: APIThatCanLogin { }
class SecondAPI: APIThatCanLogin { }
class ThreeAPI: APIThatCanLogin, APIThatCanSave { }

但也许您应该重新考虑使用协议(protocol)。至少在这个例子中它没有提供任何好处。

关于swift - 相同的协议(protocol)对象,但功能不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56254963/

相关文章:

xcode - 确定在 Swift 中创建对称 key 异常的原因

ios - 如何使用 CABasicAnimation 在 Swift 中更改圆形动画的起点?

ios - 如何通过uiimagepickercontroller获取所选视频的地理位置

windows - Windows 服务高可用性的任何模式?

java - MVP 到 MVVM Android

swift - 如何在WKWebView中登录通过登录名和密码加密的网页(http)

design-patterns - 我应该在 IoC 上走多远?

java - 在多线程程序中缓冲数据库插入

java - 返回集合中所有值的总和以及特定值的总和的两种方法

ios - 用 CAShapeLayer 画一条线