gpt4 book ai didi

swift - A 型要求 B 型是类类型 swift 4

转载 作者:IT王子 更新时间:2023-10-29 05:23:32 25 4
gpt4 key购买 nike

下面的代码给我一个编译错误

'WeakReference' requires that 'ServiceDelegate' be a class type

protocol ServiceDelegate: AnyObject {
func doIt()
}

class SomeClass() {
// compile error occurs in this line
private var observers = [WeakReference<ServiceDelegate>]()
}

弱引用代码:

final class WeakReference<T: AnyObject> {

private(set) weak var value: T?

init(value: T?) {
self.value = value
}
}

如何解决这个错误?应根据此 site 正确声明委托(delegate).

到目前为止我尝试了什么:

  • 将委托(delegate)协议(protocol)一致性从 AnyObject 更改为class 没有解决问题。
  • 在干净的 Playground 上尝试上面的代码。

最佳答案

你不能有 WeakReference<ServiceDelegate> . ServiceDelegate本身不是 AnyObject , 它只要求任何符合它的东西都是 AnyObject .

你需要制作 SomeClass泛型并将泛型类型用作 WeakReference 的类型:

class SomeClass<T: ServiceDelegate> {
private var observers = [WeakReference<T>]()
}

如果在 SomeClass 上通用太严格了,你希望能够将多个不相关类的实例作为观察者,那么我会通过放弃 WeakReference 上的通用参数来做到这一点:

final class WeakServiceDelegate {
private(set) weak var value: ServiceDelegate?

init(value: ServiceDelegate?) {
self.value = value
}
}

class SomeClass {
private var observers = [WeakServiceDelegate]()
}

或者你可以制作WeakReference有条件地符合 ServiceDelegate :

extension WeakReference: ServiceDelegate where T: ServiceDelegate {
func doIt() {
value?.doIt()
}
}

然后使用 ServiceDelegate 的数组在 SomeClass :

class SomeClass {
private var observers = [ServiceDelegate]()

func addObserver<T: ServiceDelegate>(_ observer: T) {
observers.append(WeakReference(value: observer))
}
}

关于swift - A 型要求 B 型是类类型 swift 4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51486965/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com