给类似于类的下列方法(让我们说Table类),其中键和值都是符合协议值的数据类型。数字类型,字符串,布尔等扩展为符合Value协议。
open class Table: StoredValue {
...
open func asDictionary<K1: Value, V1: Value, K2: Value, V2: Value>(
_ kfn: (K1) -> K2 = {$0 as! K2},
_ vfn: (V1) -> V2 = {$0 as! V2}
) -> [K2: V2] where K2: Hashable {
var v = [K2: V2]()
for key in keys() {
let val = self[key]
if key is K1 && val is V1 {
v[kfn(key as! K1)] = vfn(val as! V1)
}
}
return v
}
}
Table类本身不是泛型类,但转换为本机Swift容器类的方法是通用的。
问题是从我的代码调用方法。我试过用各种方法来调用方法,我只是无法让它工作。谷歌搜索也没有找到任何解决方案。我相信它在Swift 4.x之前有效,但有些东西已经改变了。
例如:
使用默认会话闭包调用方法:
let dict = options.asDictionary()
Xcode会抱怨(这是正确的)错误“无法推断出通用参数'K1'”
使用目标类型调用方法:
let dict: [String: Any] = options.asDictionary()
Xcode会抱怨错误“无法将类型'[_:_]'的值转换为指定类型'[String:Any]'”
像这样提供转换结束:
let dict: [String: Any] = options.asDictionary({ $0 as! String }, { $0 as Any })
Xcode抱怨错误“表达式类型'字符串'含糊不清,没有更多上下文”
通用方法定义是错误的吗?