Swift: выбор реализации метода конкретного типа, определенного в расширениях? - PullRequest
0 голосов
/ 26 октября 2018

Вопрос:

Есть ли способ заставить 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

Кем я былв надежде на:

Я надеялся, что инициализатор вызовет специфичное для типа переопределение, определенное в расширении, вместо универсальной базовой реализации.

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...