Рассмотрим следующий пример:Swift: «Прервать ловушку: 6 - указатель освобождения не был выделен» с классом, где положение
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 ловушки 6
...
стриж (4946,0x7fff777c9300) таНос: *** ошибки для объекта 0x7fff5a5fbfe0: пуанты r не было выделено
который, для меня, абсолютно не имеет смысла. Я подтвердил, что ошибка исчезнет, когда я удалить where
дизъюнкцию ограничение как это:
final class FooClass<F: Foo> {}
Я знаю, что это длинный выстрел в темноте, но кто-нибудь сталкивался с этим?
И если да, то обходной путь, который вы нашли?
Добавление: Это могло бы полностью избежать, если быстры позволило выразить равенство ограничение внутри сам вместо утечки ограничений в ее реализатором. См. this question.
Это «загадочное сообщение об ошибке» больше похоже на сбой компилятора Swift. Если это так, вы должны создать минимальный пример и сообщить об этом Apple по адресу bugreport.apple.com. Для чего это стоит, я получаю другую ошибку. «Данные» не являются типом члена «F.FooBar», который имеет гораздо больший смысл. (Xcode 7.1.1) – JeremyP
@JeremyP Я знаю, что это сбой компилятора. Это довольно очевидно благодаря его сообщению, не указывая. То, что я подразумевал под термином ** cryptic **, было его нерелевантность к коду под рукой. И я уже сообщил. Благодарю. –
Из текста вашего вопроса не было очевидно, что вы поняли, что на вашем компьютере произошел сбой компилятора. Я не был, кстати, критиковал ваш вопрос или предлагал вам не спрашивать об этом из-за этого, я просто пытался убедиться, что Apple узнала о проблеме, чтобы ее можно было исправить. Является ли ваш код неправильным или нет, если он сбой компилятора, это ошибка в компиляторе. – JeremyP