2017-12-19 3 views
2

Ich versuche ein Protokoll B zu definieren, das Protokoll A erweitert (das letztere enthält den zugehörigen Typ C), während eine where-Klausel mit derselben Integritätsregel wie der Compiler verwendet wird schlägt vor. Allerdings wird der Code nicht mehr kompiliert. Ist das ein Swift Bug (Swift 4 in diesem Fall)?Schnelle Protokollkonformität mit zugehörigem Typ unter Verwendung derselben Bedingung

Um konkreter zu sein, den Code unten mit Fehler nicht kompilieren:

Typ ‚E‘ entspricht nicht Protokoll ‚A‘

class D { 

} 

protocol A: class { 
    associatedtype C: AnyObject 
} 

protocol B: A where C == D { 

} 

class E: B { 

} 

die Definition des Protokolls B ändern, wie unten angegeben kompiliert, sondern stattdessen diese Warnung anzeigen:

typealias zwingende zugehörigen Typ ‚C‘ aus Protokoll ‚A‘ besser als gleichTypEinschränkung auf dem Protokoll ausgedrückt wird

Der einzige Weg, um es ohne Warnungen zu machen zu kompilieren ist die typealias in der Klasse E zu spezifizieren und mit dem where-Klausel in Protokoll B, aber dies scheint die typealias zu duplizieren nicht notwendig:

protocol B: A where C == D { 

} 

class E: B { 
    typealias C = D 
} 

Antwort

2

Ich denke, gleich type constraint für die Protokolldeklaration wird nicht von Klassen gelesen, wenn sie diesem Protokoll entspricht.

reduplication von typealias zu vermeiden, Sie gleichen Typs Einschränkung von Protokoll B und Verwendung Erweiterung entfernen typealias auf Protokoll B.

class D { 

} 

protocol A: class { 
    associatedtype C 
} 

protocol B: A { 
} 

extension B { 
    typealias C = D 
} 

class E: B { 
} 
+1

Dank geben! Diese Arbeit scheint es zu beheben. Trotzdem halte ich es für einen Fehler und habe ein Problem im Swift Issue Tracker angemeldet. –

Verwandte Themen