我正在尝试构建一个 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()
最佳答案
如果您不希望在 FirstAPI
和 SecondAPI
上使用 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/