Почему Swift вызывает функцию не из расширенного предложения where? - PullRequest
0 голосов
/ 23 апреля 2019

Если я вызываю функцию (например, funcB) из класса, имеющего расширение, в котором предложение сразу все работает как положено.

Но если я вызываю какую-то другую функцию (например, funcA) класса, и вызываемая функция использует funcB внутри, я вижу результат из оригинального funcB, а не из расширения.

Пример кода:

class Bar {

}

class Foo<T> {

    func funcA() {
        funcB()
    }

    func funcB() {
        print("Parent without clause")
    }

}

extension Foo where T: Bar {

    func funcB() {
        print("Parent + clause")
    }

}

Foo<Any>().funcB()

Foo<Bar>().funcB()

print("--")

Foo<Any>().funcA()

Foo<Bar>().funcA()

Выход:

Родитель без предложения

Родитель + предложение

-

Родитель без пункта

Родитель без пункта

Я хочу вызвать другую реализацию в зависимости от родителя T и отправить T во второй класс.

Если T является дочерним элементом для Bar, используйте класс , иначе верните ноль.

Ответы [ 2 ]

2 голосов
/ 23 апреля 2019

Чтобы иметь какое-то "абстрактное" поведение класса, вы можете использовать протокол вместо универсального класса.

Примерно так:

class Bar: FooProtocol {
}

class Foo: FooProtocol {
}

protocol FooProtocol {
    func funcA()
    func funcB()
}

extension FooProtocol {
    func funcA() {
        funcB()
    }

    func funcB() {
        print("Parent without clause")
    }
}

extension FooProtocol where Self: Bar {
    func funcB() {
        print("Parent + clause")
    }
}

Здесь я использовал реализацию по умолчаниюдля FooProtocol, но вы можете определить функции внутри класса Foo и Bar в зависимости от того, что вы хотите.Тогда у вас будет такой результат:

    let bar = Bar()
    bar.funcA() // Parent + clause
    bar.funcB() // Parent + clause

    let foo = Foo()
    foo.funcA() // Parent without clause
    foo.funcB() // Parent without clause
0 голосов
/ 26 апреля 2019

Это правильное поведение для текущей реализации Swift.

https://bugs.swift.org/browse/SR-10549

...