Swift: вызов перегруженного метода с неоднозначным типом возврата - PullRequest
0 голосов
/ 06 февраля 2020

Предположим, у меня есть следующий код:

    public class A {}
    public class B : A {}
    public class Foo {
        public func bar() -> A {
            print("secret hidden method")
            return A()
        }

        public func bar() -> B {
            print("easily accessible method")
            return B()
        }
    }

Проблема в том, что попытка их вызвать приводит к двусмысленности. Вы можете вызвать bar() -> B с Foo().bar() as B, но все Foo().bar(), Foo().bar() as A и let a: A = Foo().bar() приводят к ошибке Ambiguous use of 'bar()' компилятора.

Итог: Как мне позвонить bar() -> A? Есть ли хитрый синтаксис для него? Нужно ли отражение? Достаточно ли отражения ?

1 Ответ

1 голос
/ 06 февраля 2020

Компилятор должен иметь возможность определить, какой вариант bar() вы хотите выполнить. Вы можете явно указать тип func, который вы хотите выполнить, и воспользоваться карри для доступа к правильной реализации для данного экземпляра.

let foo = Foo()
let a: ()->A = Foo.bar(foo)
let b: ()->B = Foo.bar(foo)
a()
b()

Приведенный выше код выведет:

secret hidden method
easily accessible method
...