0

我正在尝试创建一个“转换”协议,如果字典的值实现所述协议,则字典可以遵循该协议。

import Foundation

protocol Fooable {
    var foo:String { get }
}

extension Double:Fooable {
    var foo:String { get { return "number" } }
}

extension Int:Fooable {
    var foo:String { get { return "count" } }
}

extension String:Fooable {
    var foo:String { get { return "name" } }
}

extension Dictionary:Fooable where Key == String, Value:Fooable {
    var foo:String {
        get {
            var result = "["
            self.keys.sorted().forEach { key in
                result += key
                result += ": "
                result += self[key]!.foo
            }
            result += "]"
            return result
        }
    }
}

["a": 6.28, "b": 42, "c": "boo"].foo

问题是最后一行被认为是模棱两可的:

error: type of expression is ambiguous without more context
["a": 6.28, "b": 42, "c": "boo"].foo
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~

我正在尝试做的事情是否可行?我必须更改或添加什么才能使其正常工作?

更新

Type Erasure 似乎是一种“解决方案”。所以基本上,我需要做一些类似的事情:

struct AnyFoo<Fooable> { }

此时,我现在可以包装/擦除字典文字中的所有内容:

["a": AnyFoo(6.28), "b": AnyFoo(42), "c": AnyFoo("boo")].foo

以及将 Dictionary 的扩展改进为 Dictionary 的 Value 为 AnyFoo。这真的比仅仅将字典的扩展限制在 Value 是 String 的情况下并只是做:

["a": 6.28.foo, "b": 42.foo, "c": "boo".foo].foo

对于一个简单的“转换”案例,我不确定使用 TypeErasure 通过包装器延迟转换,而不是在创建字典之前进行转换。后者的实际输入较少(如在字符输入中)。所以我真的没有任何收获。

除非我遗漏了什么,就我而言,我可能只会as? Fooable对容器元素使用向下转换(例如 ),并执行诸如日志错误之类的操作。

4

0 回答 0