调用Swift 4泛型方法会产生错误

时间:2018-05-07 17:26:23

标签: swift generics swift4.1

给类似于类的下列方法(让我们说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抱怨错误“表达式类型'字符串'含糊不清,没有更多上下文”

通用方法定义是错误的吗?

0 个答案:

没有答案