Во-первых, я очень подозрительно отношусь к «менеджеру», который является значением (структурой), а не экземпляром (классом).Вы действительно хотите использовать здесь структуры и протоколы?Структуры не имеют идентичности;две структуры с одинаковыми свойствами должны быть полностью взаимозаменяемыми друг с другом, и подобные вещи обычно не называют "manager".
То, что вы описываете, безусловно, доступно для записи.Это просто бесполезно.Вот как вы пишете:
struct ManagerFactory {
static func create(_ type: MyProtocol1.Protocol) -> MyProtocol1 {
return MyManager1()
}
static func create(_ type: MyProtocol2.Protocol) -> MyProtocol2 {
return MyManager2()
}
}
let mgr1 = ManagerFactory.create(MyProtocol1.self)
let mgr2 = ManagerFactory.create(MyProtocol2.self)
Но это всего лишь сложный способ использовать перегрузку методов для замены имен.
То, что вам нужно, это единственный метод, но что бы еготип возврата будет?Даже в C # я не думаю, что это доступно для записи без добавления отвратительных ударов.(Это точка, которую вы и paulw11 обсуждаете в комментариях.) Это не ограничение Swift;это фундаментальная характеристика типов.Даже в JavaScript вам нужно знать, что вы ожидаете получить, иначе вы не будете знать, какие методы вы можете вызвать для него (просто вы отслеживаете это ожидание в своей голове и документации, а не в компиляторе и коде)..
Похоже, вы создали здесь множество протоколов, и я держу пари, что они в основном имеют ровно одну реализацию.Это плохо, Свифт.Не создавайте протоколы, пока у вас нет особой потребности в них.Не создавайте аттракционы для развлечения.Они сожгут вас очень быстро.
Если ваши протоколы действительно выглядят так, и у вас действительно есть разные реализации этих методов (т.е. не делайте этого, если есть только одна реализацияMyProtocol1
«на всякий случай»), вам действительно нужны функции:
struct API {
let login: () -> Void
let payment: () -> Void
}
let myAPI = API(login: myLoginFunction, payment: myPaymentFunction)
Это позволит вам создавать различные API, если они вам нужны.Но опять же, только если вам нужна эта гибкость.Если нет, просто используйте классы для экземпляров и структуры для значений и избегайте протоколов, пока в вашей программе не будет хотя бы 2, а лучше 3 реализации.