Если подкласс реализует необязательную функцию, вызов функции по протоколу работает как положено. А именно, он будет вызывать дочерний метод, даже если он не реализован в родительском классе.
Когда мы вводим обобщенные значения в родительский класс, это поведение перестает работать.
Вот игровая площадка, показывающая проблему. ..
import UIKit
@objc
protocol MyProtocol {
@objc optional func foo()
}
// MARK: - Works
class Parent: MyProtocol { }
class Child: Parent {
func foo() { print("Child.foo()") }
}
(Child() as MyProtocol).foo?()
// ✅ Outputs `Child.foo()`
// MARK: - Broken
class BrokenParent<T>: MyProtocol { }
class BrokenChild: BrokenParent<String> {
func foo() { print("BrokenChild.foo()") }
}
(BrokenChild() as MyProtocol).foo?()
// ❌ Bug: does not output anything
Почему это происходит и какие обходные пути существуют, чтобы это исправить?
Xcode 11.4.1