1

将以下方法提供给类似字典的类(假设是 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 报错“表达式类型‘字符串’在没有更多上下文的情况下不明确”

泛型方法定义错误吗?

4

0 回答 0