2016-04-26 8 views

Antwort

3

Swift erlaubt es nicht, einen Typ und ein Protokoll wie Objective-C zu kombinieren, obwohl Sie eine Kombination von Protokollen angeben können. Da AnyObject in der Tat ist ein Protokoll, können Sie erreichen, was Sie oben durch Schreiben zum Ausdruck bringen wollen:

public struct Subscription { 
    private weak var subscriber:protocol<Subscriber, AnyObject>? = nil 
} 

Diese subscriber sowohl die Subscriber und die AnyObject Protokolle anzupassen erfordern.

In Ihrem Fall oben, brauchen Sie eigentlich nicht den AnyObject Teil, da Sie das Subscriber Protokoll ein class Protokoll hergestellt, das im Wesentlichen, dass garantiert jede konforme Art ist auch ein AnyObject. So konnte man nur schreiben:

public struct Subscription { 
    private weak var subscriber:Subscriber? = nil 
} 

Aber der protocol<Subscriber, AnyObject> Ansatz würde Ihr Subscriber-Protokoll erlaubt, nicht nur Klassentypen eingeschränkt werden, während dieser spezifischen subscriber schwach var auf Klassentypen beschränkt zu machen, die Subscriber implementieren.

2

Um auf ein Objekt zu verweisen, das einem Protokoll entspricht, verwenden Sie einfach das Protokoll. Swift ist nicht Objective-C, wo Sie zuvor id<SomeProtocol> angeben müssen:

public struct Subscription { 
    private weak var subscriber: Subscriber? = nil 
} 

Sie können auch Ihre Protokoll wie folgt erklären, wenn Sie Nutzung AnyObject einschränken wollen, anstatt mit class:

public protocol Subscriber : AnyObject { 
    // ... 
} 
Verwandte Themen