在 Swift 中,为什么错误"type alias references itself"取决于类型别名的定义位置?



我在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版本中。

最新更新