我以前在c中声明过递归泛型类:

  public class CommandSet<commandSetT, commandT> : ICommandSet
               where commandSetT : CommandSet<commandSetT, commandT>
               where commandT : Command
  {

  }

现在,我想在斯威夫特做同样的事。原因是我希望commandSetT必须是这个基类型的子类。
public class CommandSet<commandSetT, commandT : Command> : CommandSetProtocol
             where commandSetT : CommandSet<commandSetT, commandT>,
             commandT : Command
{

}

但是,编译器抱怨超类约束是递归的。
是的,因为我想确保commandSetT是这个类的一个子类。
除了诸如“well swift is not c”之类的明显评论外,我真的很想听听任何知道如何执行这一要求的人的意见。

最佳答案

我也遇到了同样的问题,我自己找到了一些解决办法——也许对你也有帮助:

protocol A : class {
    associatedtype AType

    var aVar: AType? { get }
}

protocol B : A {
    associatedtype BType : A
}

class Test<AType> : B {
    typealias BType = Test<AType>

    var aVar: AType?
}

class Overriding : Test<String> {
    typealias BType = Overriding
}

但如果你删除了
var aVar: AType? { get }

声明,我不知道为什么;)

10-06 02:20