Рассмотрим следующее:
protocol DataContainer {
typealias Data
}
protocol Foo {
typealias FooBar: DataContainer
typealias FooBaz: DataContainer
typealias Schema
}
final class FooClass<F: Foo where F.Schema == F.FooBar.Data, F.Schema == F.FooBaz.Data> {}
Это довольно выразительное предложение where
не компилируется с загадочным сообщением об ошибке:
Команда не выполнена из-за сигнала: Abort trap 6
...
swift(4946,0x7fff777c9300) malloc: *** ошибка для объекта 0x7fff5a5fbfe0: освобождаемый указатель не был выделен
что для меня абсолютно бессмысленно. Я подтвердил, что ошибка исчезает, когда я удаляю ограничение предложения where
следующим образом:
final class FooClass<F: Foo> {}
Я знаю, что это долгий путь в темноте, но кто-нибудь сталкивался с этим?
И если да, то какой обходной путь вы нашли?
Приложение: этого можно было бы полностью избежать, если бы swift позволял выражать ограничение равенства внутри самого protocol
вместо того, чтобы передавать ограничения в его реализацию. См. этот вопрос.