不能特殊的非泛型类型AnyObject

时间:2016-04-26 14:49:30

标签: swift

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

为什么我不能将AnyObject与此var的协议一起使用?

2 个答案:

答案 0 :(得分:4)

Swift不允许以Objective-C的方式组合类型和协议,尽管您可以指定协议的组合。由于AnyObject实际上是一个协议,因此您可以通过编写以下内容来完成您想要表达的内容:

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

这要求subscriber符合SubscriberAnyObject协议。

在上面的例子中,您实际上不需要AnyObject部分,因为您使Subscriber协议成为class协议,这基本上保证了任何符合类型也是AnyObject协议。 1}}。所以你可以写:

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

protocol<Subscriber, AnyObject>方法允许您的订阅者协议不仅限于类类型,同时使特定的subscriber弱变量仅限于实现Subscriber的类类型。

答案 1 :(得分:2)

要引用符合协议的对象,只需使用协议即可。 Swift与Objective-C不同,您需要指定id<SomeProtocol>

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

如果您想将使用限制为AnyObject,而不是使用class,您也可以声明您的协议:

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