public protocol Subscriber : class {
}
public struct Subscription {
private weak var subscriber:AnyObject<Subscriber>? = nil
}
为什么我不能将AnyObject
与此var的协议一起使用?
答案 0 :(得分:4)
Swift不允许以Objective-C的方式组合类型和协议,尽管您可以指定协议的组合。由于AnyObject
实际上是一个协议,因此您可以通过编写以下内容来完成您想要表达的内容:
public struct Subscription {
private weak var subscriber:protocol<Subscriber, AnyObject>? = nil
}
这要求subscriber
符合Subscriber
和AnyObject
协议。
在上面的例子中,您实际上不需要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 {
// ...
}