我在Xcode 9.4.1中使用Swift 4.1。我需要创建一个字典,它可以容纳有限的各种数据类型作为值,所以我想将字典定义为比[String: Any]
更具体的东西。我决定创建一个协议,并利用Swift 4的条件一致性来允许相同类型的嵌套字典。我的代码看起来是这样的:
protocol MetricsValue {}
typealias MetricsDictionary = [String: MetricsValue]
//Now define which types can go in the dictionary:
extension String: MetricsValue {}
extension Dictionary: MetricsValue where Key == String, Value == MetricsDictionary {}
编译失败,错误为:"Type alias MetricsDictionary references self。"然后我尝试了一下,并没有真正期望它能工作:
protocol MetricsValue {}
//Now define which types can go in the dictionary:
extension String: FDGoogleMetricsValue {}
extension Dictionary: MetricsValue where Key == String, Value == MetricsDictionary {}
typealias MetricsDictionary = [String: MetricsValue]
它编译了!在扩展下面定义类型别名是可行的。为什么第二个例子编译了,但第一个例子失败了?
编辑:经过思考,我实际上想让MetricsDictionary
符合MetricsValue
,即extension Dictionary: MetricsValue where Key == String, Value == MetricsValue
,它可以毫无问题地工作。我本来打算删除这个问题,但它看起来仍然很奇怪,所以我会保留下来,以防其他人觉得它有帮助。
这很有趣,您提供的代码是:
protocol MetricsValue {}
typealias MetricsDictionary = [String: MetricsValue]
extension String: MetricsValue {}
extension Dictionary: MetricsValue where Key == String, Value == MetricsDictionary {}
未能在Xcode 9.4.1中编译,但在Xcode 10.0测试版(10L176w(中没有问题。此外,我已经用swift 4.1.2在线编译了代码,它也没有问题。
Xcode 8.2.1也有类似的错误报告,他们在8.3中修复了它。也许它出现在当前的Xcode版本中。