2015-06-16 19 views
42

Ich aktualisierte mein Projekt zu Swift 2, und erhielt eine Reihe von redundant conformance of XXX to protocol YYY. Dies passiert besonders oft (oder immer), wenn eine Klasse CustomStringConvertible entspricht. Auch etwas Platz mit Equatable.Redundante Konformität Fehlermeldung Swift 2

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

Ich vermute, dass ich brauche nicht explizit auf ein Protokoll entsprechen, wenn ich var description: String { get } implementieren, oder was auch immer Methoden das Protokoll erfordert. Sollte ich einfach den Anweisungen folgen und alle entfernen? Erkennt Swift nun automatisch die Konformität, wenn eine Klasse alle Methoden des Protokolls implementiert?

+0

* "Ich vermute, dass ich nicht explizit einem Protokoll entsprechen muss" * ... das ist falsch. Wenn Sie mit einem Protokoll interagieren wollen, müssen Sie sich explizit daran halten. * "Soll ich einfach die Fixit-Anweisungen befolgen?" * Sie müssen Ihrer Frage weitere Details hinzufügen, damit wir das Problem reproduzieren können. * "Ergibt Swift jetzt automatisch die Konformität, wenn eine Klasse alle Methoden des Protokolls implementiert?" * Nr. –

+1

@ 0x7fffffff 'CustomStringConvertible' ist ein neues Protokoll in Swift 2 - [siehe hier] (http://swiftdoc.org/swift) -2/Protokoll/CustomStringConvertible /). Ich bin mir nicht sicher über 'GraphFeature'. –

+1

@AaronBrager: Nicht wirklich neu, nur umbenannt von 'Printable'. –

Antwort

84

Diese Fehlermeldung wird in Xcode 7 (Swift 2) angezeigt, wenn eine Unterklasse die Konformität mit einem Protokoll deklariert, das bereits von einer Oberklasse geerbt wurde. Beispiel:

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

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

Das Fehlerprotokoll zeigt:

 
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 { 
    ^

die Protokollkonformität von der Unterklasse Erklärung Entfernen löst das Problem:

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

Aber die übergeordnete Klasse muss die Konformität erklärt ausdrücklich, es ist nicht automatisch aus der Existenz der description Pro abgeleitet Teil.

+2

In meiner Instanz würde ich gerne das override-Schlüsselwort verwenden, aber Xcode flippt über überschreiben überladene Operatoren (== für Equatable). Irgendwelche Ideen? – rob5408

+0

hilft viel danke – zyunchen

+0

es ist nicht notwendig, das override-Schlüsselwort zu verwenden. Siehe den Abschnitt "Äquivalenzoperatoren" in https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AdvancedOperators.html#//apple_ref/doc/uid/TP40014097-CH27-XID_43 –

5

Für Googler, habe ich auch diesen Fehler, wenn SwiftyJson in meine Testziel und fügen Sie eine schnelle Test-Klasse, wie SwiftyJson wieder einkompiliert wurde, und es NSNumber als vergleichbar bezeichnet. Die Lösung bestand darin, sie nur in das App-Ziel aufzunehmen.

+0

Es kann passieren, dass Sie das Ziel Ihrer Datei nicht nur für die aktuelle App (und nicht nur für die Tests) festlegen können. Wenn dies der Fall ist, trennen Sie die Datei in zwei Dateien, von denen die eine die redundante Protokollkonformität (nur das aktuelle Ziel) und die andere den Code enthält (legen Sie das Ziel für Ihre App- und App-Tests fest). –

+1

Diese Antwort half mir zu erkennen, dass ich die Quelldatei, die getestet wurde, als Mitglied sowohl meiner App als auch des Testziels hinzugefügt hatte. Durch das Entfernen als Mitglied des Testziels wurde der Fehler behoben. Seltsam, dass der Fehler plötzlich auftrat, nachdem dies lange Zeit der Fall war.Ich bin mir nicht ganz sicher, was der Auslöser war, da ich schon seit Ewigkeiten Tests (sehr ähnliche) über die vorherige Einrichtung des Besitzers durchgeführt habe. –