2016-04-17 2 views
0

nehme ich an protokollorientierte Programmierung tun wollen, und ich habe Protokolle:Satisfying Mitglied erklärt in Protokoll mit Mitglied des Subtyps oder konformen Typ

protocol BehaviorA { 
    var date: NSDate {get} 
    var name: String {get} 
} 

protocol BehaviorB { 
    var creationInfo: BehaviorA {get} 
} 

Ich möchte eine Version dieses Eigentumsmodell mit umgesetzt haben die Kerndaten. Die Kerndaten will eine spezielle Klasse für jedes Modell Einheit, so erstelle ich eine Klasse ActualA und ActualB:

class ActualA: NSManagedObject, BehaviorA { 
    @NSManaged var date: NSDate 
    @NSManaged var name: String 
} 

class ActualB: NSManagedObject, BehaviorB { 
    @NSManaged var creationInfo: ActualA 
} 

Wegen des Datenmodells Beziehung, die var vom Typ ActualA. Ich erhalte jedoch einen Kompilierungsfehler, der besagt, dass ActualB nicht mit BehaviorB übereinstimmt, und es geht weg, wenn ich die creationInfo als BehaviorA neu eintippe.

Allerdings würde ich erwarten, dass es eine Möglichkeit gibt zu sagen, diese Variable erfüllt das Protokoll Mitglied, weil sein Typ mindestens so restriktiv ist wie im Protokoll deklariert. Kann ich das irgendwie machen? Irgendwelche PoP-Fans haben Ratschläge, wie man Protokolle erreicht, die einander besitzen, aber die konformen Typen möchten spezifisch sein?

Antwort

2

Das ist ziemlich einfach. Wir müssen nur BehaviorB Protokoll ändern, eine associatedType zu verwenden:

protocol BehaviorB { 
    associatedtype Info: BehaviorA 

    var creationInfo: Info {get} 
} 

Wo wir Info nennen können, was wir wollen (was hilfreich ist, um irgendwelche Implementierer von BehaviorB, um anzuzeigen, was diese Art darstellt).

Dies ist eine Art wie Generika verwenden. Hier kann Info ein beliebiger Typ sein, solange dieser Typ BehaviorA ist, ein Protokoll, das BehaviorA erbt, oder ein konkreter Typ, der BehaviorA implementiert oder erbt.

+0

Danke für diese Info, wusste ich nicht über zugehörige Typen. Das macht sehr viel Sinn, aber als ich es ausprobiert habe, habe ich "Property kann kein Mitglied eines @objc-Protokolls sein, weil sein Typ nicht in Objective-C repräsentiert werden kann". Ich habe das '@ objc' Attribut auf' BehaviorB' weil es eine Voraussetzung für die Dependency-Injection-Bibliothek ist, die ich benutze. Irgendeine Möglichkeit, beides zuzulassen? – Quintana

+0

basierend auf http://stackoverflow.com/questions/36228546/protocol-with-associatedtype-doesnt-play-nice-with-optional Ich glaube, dass es nicht möglich ist. Ich werde nach einer Problemumgehung suchen. – Quintana

Verwandte Themen