Swift 当泛型值受AnyObject约束时,无法将其转换为AnyObject

Swift 当泛型值受AnyObject约束时,无法将其转换为AnyObject,swift,Swift,错误是无法将类型“(O?,ObservedType)->Void”的值转换为预期的参数类型“(AnyObject?,ObservedType)->Void,但我发现这很奇怪,因为O被约束为AnyObject 在上下文中,我正在创建自己的Observable类,但这个问题实际上是关于上面的特定错误消息,而不是我如何使用任何其他第三方框架来使用Observable。也就是说,在这种情况下,我如何正确地转换我的完成处理程序 可观察的公共类{ 结构观察者{ 弱var观察者:任何对象? 让完成:(AnyO

错误是
无法将类型“(O?,ObservedType)->Void”的值转换为预期的参数类型“(AnyObject?,ObservedType)->Void
,但我发现这很奇怪,因为
O
被约束为
AnyObject

在上下文中,我正在创建自己的Observable类,但这个问题实际上是关于上面的特定错误消息,而不是我如何使用任何其他第三方框架来使用Observable。也就是说,在这种情况下,我如何正确地转换我的完成处理程序

可观察的公共类{
结构观察者{
弱var观察者:任何对象?
让完成:(AnyObject?,ObservedType)->Void
}
私人var观察员:[观察员]
公共var值:ObservedType{
迪塞特{
如果let=值{
观察员()
}
}
}
public init(u值:ObservedType?=nil){
自我价值=价值
观察员=[]
}
公共函数观察(转发对象:O?,完成:@escaping(O?,ObservedType)->Void){
append(Observer(Observer:object,completion:completion))//此处出错
如果let value=value{
完成(目标、价值)
}
}
私有函数{
观察员中的观察员{
如果let value=value{
DispatchQueue.main.async{observer.completion(nil,value)}
}
}
}
}

在这种情况下是否可以强制转换我的完成处理程序,或者以某种方式等同于
O
AnyObject

根据您的类型,我可以将我想要的任何对象传递给
Observer.completion的第一个参数。但是您分配给
.completion
的函数只能接受某些特定类型的
O

您必须将
completion
更改为
(AnyObject?,ObservedType)->Void

public func observe<O: AnyObject>(forward object: O?, completion: @escaping (AnyObject?, ObservedType) -> Void) {
                                                                             ^^^^^^^^^^
public func observe(转发对象:O?,完成:@escaping(AnyObject?,ObservedType)->Void){
^^^^^^^^^^
你传递的函数必须处理这样一个事实,即它可以传递任何东西。我怀疑这会破坏你的整个系统。但我不相信这种类型的可观察性会起作用,因为正是这些类型的问题

在可观察对象中直接存储观察者确实没有什么好方法。您当前没有使用它,但我假设您希望它用于删除观察者之类的用途。有一些方法可以做到这一点,但您不能存储观察者本身。您可以返回唯一标识符(例如UUID),或者您可以使用ObjectIdentifier,或者您可以传回观察者必须调用的“remove this item”闭包。但是您通常不希望直接存储观察者(并且绝对不希望将其作为AnyObject存储)

我建议您使用Combine,因为这正是它的设计目的。或者,如果您需要支持较旧的iOS版本,请参阅以了解如何实现这一点,或者了解更接近您尝试在此处实现的简化版本