2015-12-02 2 views
0

Рассмотрим следующий пример: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.

+0

Это «загадочное сообщение об ошибке» больше похоже на сбой компилятора Swift. Если это так, вы должны создать минимальный пример и сообщить об этом Apple по адресу bugreport.apple.com. Для чего это стоит, я получаю другую ошибку. «Данные» не являются типом члена «F.FooBar», который имеет гораздо больший смысл. (Xcode 7.1.1) – JeremyP

+0

@JeremyP Я знаю, что это сбой компилятора. Это довольно очевидно благодаря его сообщению, не указывая. То, что я подразумевал под термином ** cryptic **, было его нерелевантность к коду под рукой. И я уже сообщил. Благодарю. –

+0

Из текста вашего вопроса не было очевидно, что вы поняли, что на вашем компьютере произошел сбой компилятора. Я не был, кстати, критиковал ваш вопрос или предлагал вам не спрашивать об этом из-за этого, я просто пытался убедиться, что Apple узнала о проблеме, чтобы ее можно было исправить. Является ли ваш код неправильным или нет, если он сбой компилятора, это ошибка в компиляторе. – JeremyP

ответ

0

Хорошо. Поэтому, после нескольких более грубых отладок, я обнаружил, что, если я использую те же самые имена type для ограниченных параметров, он компилируется.

Так, например,

protocol Foo { 
    typealias FooBar 
    typealias FooBaz 
    typealias Data 
} 
final class FooClass<F: Foo where F.Data == F.FooBar.Data, F.Data == F.FooBaz.Data> {} 

Это будет компиляции. Обратите внимание, что все, что я сделал, это изменить Schema на Data. Это определенно ошибка.

-EDIT: И сообщается соответственно.

Смежные вопросы