将以下方法提供给类似字典的类(假设是 Table 类),其中键和值都是符合协议值的数据类型。数字类型、String、Bool 等被扩展以符合 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 会报错“Cannot convert value of type '[_ : _]' to specified type '[String : Any]'”
像这样提供转换闭包:
let dict: [String: Any] = options.asDictionary({ $0 as! String }, { $0 as Any })
Xcode 报错“表达式类型‘字符串’在没有更多上下文的情况下不明确”
泛型方法定义错误吗?