Подтвердить что ты не робот

Избыточное сообщение об ошибке соответствия Swift 2

Я обновил свой проект до Swift 2 и получил кучу redundant conformance of XXX to protocol YYY. Это происходит особенно часто (или всегда), когда класс соответствует CustomStringConvertible. Также место с Equatable.

class GraphFeatureNumbersetRange: GraphFeature, CustomStringConvertible { // <--- get the error here
...
}

Я подозреваю, что мне не нужно явно указывать протокол, когда я реализую var description: String { get } или любые методы, которые требуется протоколу. Должен ли я просто следовать инструкциям fixit и удалять все это? Теперь Swift автоматически определяет соответствие, если класс реализует все методы протокола?

4b9b3361

Ответ 1

Вы получите это сообщение об ошибке в Xcode 7 (Swift 2), если подкласс объявит о соответствии к протоколу, который уже унаследован от суперкласса. Пример:

class MyClass : CustomStringConvertible {
    var description: String { return "MyClass" }
}

class Subclass : MyClass, CustomStringConvertible {
    override var description: String { return "Subclass" }
}

Журнал ошибок показывает:

main.swift:10:27: error: redundant conformance of 'Subclass' to protocol 'CustomStringConvertible'
class Subclass : MyClass, CustomStringConvertible {
                          ^
main.swift:10:7: note: 'Subclass' inherits conformance to protocol 'CustomStringConvertible' from superclass here
class Subclass : MyClass, CustomStringConvertible {
      ^

Удаление соответствия протокола из декларации подкласса решает проблему:

class Subclass : MyClass {
    override var description: String { return "Subclass" }
}

Но суперкласс должен объявить соответствие явно, это не автоматически определяется из существования description свойство.

Ответ 2

Для гуглеров я также получил эту ошибку при включении SwiftyJson в мою целевую аудиторию и добавлении быстрого тестового класса, поскольку это привело к тому, что SwiftyJson снова был скомпилирован, и объявляет NSNumber как Comparable. Решение заключалось в том, чтобы включать его только в целевую программу.