2017-01-04 1 views
1

В Swift, насколько я понимаю, протоколы описывают атрибуты, которые могут применяться к структуре данных. Затем расширения протокола позволяют определять эти атрибуты для каждой структуры данных, к которой они применяются.Недопустимое переопределение переменной в расширенном расширении протокола

Если это правда, то почему появляется следующее сообщение об ошибке:

недействительным переопределение 'недействительный'

На этой линии:

extension CausesError where Self: Example { var invalid: Bool { return true } } 

В этом коде:

struct Example: CausesError { } 

protocol CausesError { var invalid: Bool { get } } 

extension CausesError where Self: Example { var invalid: Bool { return true } } 
+0

Вы заметили, что есть еще одна ошибка? * "type 'Self', ограниченный не-протокольным типом 'Example'" * - Это реальная проблема. –

+0

Я не вижу эту ошибку, только указанную в вопросе, а затем консоль, указав местоположение ее первоначального использования. Тем не менее, Xcode не всегда имеет непротиворечивое представление ошибки, так что же такое ошибка указывает? –

+2

'Example' - это' struct', тип значения, который не позволяет наследование. 'Self' не может соответствовать (по протоколу) или наследовать (как для класса)' Example'. Если вы, например, измените 'Example' на' class' вместо struct, выше будет компилироваться. – dfri

ответ

0

Просто синтезировать то, что @dfri сказал для тех, кто see this later Фактическая ошибка была вызвана:

extension CausesError where Self: Example 

Поскольку пример является структурой, и, следовательно, не имеет свойства собственной личности.

Проблема в том, что у меня было фундаментальное заблуждение относительно расширения протокола.

Структура представляет собой конкретный тип, поэтому определение «невыполнения обязательства по умолчанию» недействительно просто соответствует требованиям к протоколу. [Один] может выбрать, чтобы Пример соответствовать CausesError расширения, а не в декларации:

extension Example: CausesError { var invalid: Bool { return true } } 

, но это в основном семантика (w.r.t. прямого соответствия). Это не то же самое, что и предоставление реализации по умолчанию (для группы объектов, например, полученных из типа класса или соответствующей некоторому протоколу), а просто для соответствия конкретному типу данному протоколу.

Поэтому то, что я должен был сделать (для того, чтобы обеспечить реализацию по умолчанию на уровне протокола, даже типы данных) было просто:

extension CausesError { var invalid: Bool { return false } } 

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

  • Нет связанных вопросов^_^