我正在尝试创建一个“转换”协议,如果字典的值实现了所述协议,则字典可以遵循该协议。
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
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~
我想做的是可行的吗?我需要更改或添加什么才能使其生效?
更新
类型擦除似乎是一种“解决方案”。所以基本上,我需要做一些类似的事情:
struct AnyFoo<Fooable> { }
在这一点上,我现在可以将字典中的所有内容按字面意思包装/删除:
["a": AnyFoo(6.28), "b": AnyFoo(42), "c": AnyFoo("boo")].foo
以及将dictionary的扩展细化为dictionary的where value为anyfoo。这真的比把字典的扩展限制在值为字符串的情况下并只执行以下操作要好吗?
["a": 6.28.foo, "b": 42.foo, "c": "boo".foo].foo
对于一个简单的“convert”案例,我不确定使用typeerasure延迟通过包装器的转换会有什么好处,而不是仅仅在字典创建之前进行转换。更少的实际输入(如字符输入)来完成后者。所以我什么都没得到。
除非我漏掉了什么东西,否则我可能只会选择下流媒体(例如。
as? Fooable
)对于容器元素,执行日志错误之类的操作。