我正在尝试创建一个“转换”协议,如果字典的值实现所述协议,则字典可以遵循该协议。
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
对容器元素使用向下转换(例如 ),并执行诸如日志错误之类的操作。