Вопрос:
Есть ли способ заставить Swift выбирать переопределение для конкретного типа при вызове из функции в базовой реализации?
Контекст:
Я пытаюсь решить / обойти другую проблему (из-за того, что реализации Swift протокольных методов не видны, если они находятся в общих классах), и я пытаюсь выяснить, как я мог бы соединитьпроблема с делегированием для закрытия аргументов.
Я надеялся, что смогу использовать реализации методов в расширениях классов с ограничениями типов, чтобы обеспечить разные реализации для разных типов данного обобщенного класса.Однако я вижу, что реализации расширений используются только тогда, когда методы вызываются напрямую, и nto из другого метода в классе.Есть ли способ обойти это, любую другую технику, которую я могу использовать?
class Fubar<T, U> {
init() {
doSomething()
doSomethingDynamic()
}
func fromFunction() {
doSomething()
doSomethingDynamic()
}
func doSomething() {
print("Base implementation doSomething")
}
@objc dynamic func doSomethingDynamic() {
print("Base implementation doSomethingDynamic")
}
@objc dynamic func callDirectly() {
print("Base implementation of callDirectly")
}
}
extension Fubar where U == String {
func doSomething() {
print("U is a string!")
}
func doSomethingDynamic() {
print("U is a string!")
}
func callDirectly() {
print("U is a String!")
}
}
let fubar = Fubar<Int, String>()
fubar.callDirectly()
fubar.fromFunction()
Что я на самом деле получил:
Base implementation doSomething
Base implementation doSomethingDynamic
U is a String!
Base implementation doSomething
Base implementation doSomethingDynamic
Кем я былв надежде на:
Я надеялся, что инициализатор вызовет специфичное для типа переопределение, определенное в расширении, вместо универсальной базовой реализации.
Спасибо!