gpt4 book ai didi

swift - 将 self 作为参数传递给需要与 self 相同类型作为参数的协议(protocol)函数

转载 作者:行者123 更新时间:2023-11-28 06:58:26 25 4
gpt4 key购买 nike

我正在编写一个返回 Future 值的异步字典:

  • 如果它已经被缓存则立即,或者
  • 在(网络)操作之后,如果还没有的话

我类(class)里的字典是通用的,所以类(class)也是。目前,用户必须阅读文档并知道如何设置 dataCall 函数,这就是字典如何知道如何获取键值的方式,形式为

var dataCall: ((key: Key) -> Future<Value, MyError>)?

但这需要其他程序员知道数据调用并进行设置。所以我写了一个协议(protocol)

protocol CacheDelegate {
typealias T: Hashable
typealias U
func dataCallForCacheManager(cacheManager: CacheManager<T, U>) → (key: T) → Future<Value, MyError>
}

但是,如果我尝试在 init() 中调用它作为

delegate.dataCallForCacheManager(self)

我得到了错误

Cannot invoke dataCallForDictionary with an argument list of type '(CacheManager)'

我也不能创建一个 var delegate: CacheDelegate? 因为

Protocol CacheDelegate can only be used as a generic constraint because it has Self or associated type requirements.

所以我发现自己陷入了困境,我无法将自己作为参数传递,而且我无法设置委托(delegate)来从该协议(protocol)中获取我的数据调用。我错过了什么吗?我愿意做 Swift 2 Voodoo。

玩具示例的内容(没有 Futures 和字典以及所有内容)如下:

import Foundation

protocol Delegate {
typealias T: Hashable
typealias U
func dataCallForDictionary(dictionary: MyDictionary<T, U>) -> (T) -> (U)
}

struct MyDictionary<Key: Hashable, Value> {
typealias T = Key
typealias U = Value

init<Object: Delegate>(delegate: Object) {
dataCall = delegate.dataCallForDictionary(self)
// self.delegate = delegate
}

var delegate: Delegate?

var dataCall: ((key: Key) -> Value)?
}

最佳答案

以您为例,您是否考虑过:

protocol Delegate {
func dataCallForDictionary<T: Hashable, U>(dictionary: MyDictionary<T, U>) -> T -> U
}

struct MyDictionary<Key: Hashable, Value> {
var delegate: Delegate?
var dataCall: ((key: Key) -> Value)?

init(delegate: Delegate) {
self.delegate = delegate
dataCall = delegate.dataCallForDictionary(self)
}
}

关于swift - 将 self 作为参数传递给需要与 self 相同类型作为参数的协议(protocol)函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32703775/

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