2016-04-08 10 views
3

Ein Protokoll P erfordert eine Variable v der Klasse C.ist Swift strenger Klasse in Protokoll Vars durchsetzen?

Klasse X implementiert Protokoll P eine Variable v der Klasse erklärt C1 wo C1C erstreckt.

Hier ist der Code:

import Foundation  

class C { } 
class C1: C { } 

protocol P { 
    var v: C { get set } 
} 

class X: P { 
    var v: C1 

    init(withV v: C1) { 
     self.v = v 
    } 
} 

Xcode Beschwerden mit diesem Fehler:

Type 'X' does not conform to protocol 'P' 
Protocol requires property 'v' with type 'C' 
Candidate has non-matching type 'C1' 

Warum ist der Compiler zwingt mich genau in dem Protokoll erklärt den gleichen Typ übereinstimmen?

Edit:

Genau die gleiche Umsetzung in Obj-C kompiliert ohne Fehler oder Warnungen

@interface C: NSObject 
@end 
@implementation C 
@end 

@interface C1: C 
@end 
@implementation C1 
@end 

@protocol P <NSObject> 
    @property (nonatomic, strong) C *v; 
@end 

@interface X: NSObject <P> 
    @property (nonatomic, strong) C1 *v; 
@end 
@implementation X 
@end 

Antwort

1

Es ist nicht Sie zwingt, genau zu passen, aber es zwingt Sie Runtime-Probleme zu vermeiden. Ihre Konfiguration kann bedeuten, dass Sie eine Referenz an eine Komponente übergeben, die angibt, dass sie der P entspricht, aber nicht konform ist. Dies liegt daran, P sagt, dass Sie v zu jedem C setzen können, aber X sagt, dass Sie v zu jedem C1 setzen können.

Also, wenn Sie eine andere Unterklasse von C, C2 erstellen würden und versuchen, das zu verwenden, würde alles auseinander fallen.

ich Ihr obj-c Beispiel erwarten würde, sie zu beschweren, dass Sie die Eigenschaft nicht implementiert oder synthetisiert haben angegeben, in dem Protokoll zu existieren ...

+0

Obj-C überhaupt nicht beschweren, aber ich nur herausgefunden, dass die Menge im Protokoll bedeutet, dass jeder zur Laufzeit 'v' auf eine' C'-Klasse und 'X' auf einen Zugriff auf' C' verzichten kann, als wäre es 'C1'. Danke für die Antwort. – Scakko