Попробуй это.
protocol API {
func login<T>(completion: (T) -> ())
}
extension API where Self: ThreeAPI {
func saveClient() {
}
}
В приведенном выше коде protocol API extension
доступно только для объекта типа ThreeAPI
.
Я использовал ThreeAPI
прямо здесь.Вы можете сделать common type
для всех classes
, которым требуется saveClient()
, и использовать этот тип вместо ThreeAPI
Использование:
apiClient = ThreeAPI()
(apiClient as? ThreeAPI)?.saveClient()
apiClient = FirstAPI() //saveClient() not available
apiClient = SecondAPI() //saveClient() not available
Edit-1:
Создать CommonAPI
родительский class
для всех классов, которым требуется метод saveClient()
.
class CommonAPI {
func saveClient() {
print("CommonAPI saveClient()")
}
}
Наследовать ThreeAPI
и FourAPI
из CommonAPI
class ThreeAPI: CommonAPI, API {
func login<T>(completion: (T) -> ()) {
}
override func saveClient() {
print("ThreeAPI saveClient()")
}
}
class FourAPI: CommonAPI, API {
func login<T>(completion: (T) -> ()) {
}
override func saveClient() {
print("FourAPI saveClient()")
}
}
Просто используйте switch statement
для вызова saveClient()
на всех объектах типа CommonAPI
.
apiClient = FourAPI()
apiClient = ThreeAPI()
apiClient = FirstAPI()
apiClient = SecondAPI()
switch apiClient {
case is CommonAPI:
(apiClient as? CommonAPI)?.saveClient()
default:
break
}
В этом случае, вам не нужно будет анализировать каждый тип.