Swift:为什么在类型别名中不允许使用循环引用?

时间:2018-08-05 12:12:52

标签: swift generics types

我最近写了一些看起来像这样的代码(这里的重要部分是两个类相互引用,请忽略强引用循环,因为它不在重点之列):

class A {

    var x: [String]

    var y: B

    init(y: B) {
        self.x = []
        self.y = y
    }

}

class B {

    var x: [Int]

    var y: A

    init(y: A) {
        self.x = []
        self.y = y
    }

}

现在,这已经很重复了,所以我试图用这个替换它:

class G<Element, Related> {

    var x: [Element]

    var y: Related

    init(y: Related) {
        self.x = []
        self.y = y
    }

}

typealias A = G<String, B>
typealias B = G<Int, A>

无法编译错误的地方:

error: MyPlayground.playground:38:11: error: circular reference
typealias A = G<String, B>
          ^

MyPlayground.playground:39:11: note: through reference here
typealias B = G<Int, A>
          ^

我当然可以看到,天真地解决typealias会导致无限递归。

但是,似乎第一和第二个代码示例在功能上是等效的,因此此编译应该没有问题。

我的问题是:是否像我上面所做的那样对类进行参数化设置会引起我从未想到的问题,例如为滥用创造机会,导致实际上是 t 编译? 还是应该允许这种完全合理的模式进行编译?

还有,我可以在这种情况下使用某种解决方法而不必重复几次代码吗?

0 个答案:

没有答案