私はSwiftでランダム化ツリーデータ構造を実装しています。ツリーの幅と深さを制限するために、ポリシー(戦略)パターンを使用することに決めました。Swift:ネスト/連鎖ジェネリック型制約を使用できません(ポリシーパターン)
私のポリシーは次のようになります。
protocol BaseTreeNodePolicy {
static var maximumDepth: Int { get }
static var maximumWidth: Int { get }
}
と、私はこのようになります基本クラスを持っている:
class BaseTreeNode<PolicyType: BaseTreeNodePolicy> { /* ... */ }
それのいくつかのサブクラス:
class ValueNode<ValueType, PolicyType: BaseTreeNodePolicy>: BaseTreeNode<PolicyType> { /* ... */ }
class ActionNode<PolicyType: BaseTreeNodePolicy>: BaseTreeNode<PolicyType> { /* ... */ }
はすべてが働いていますよくこのクラスを追加するまで:
// 'ChildType' is not a subtype of 'ActionNode<PolicyType>'
sequence.reserveCapacity(42)
と、この行::私は、私ははっきりと言っタイプの要件を国家として間違って何見当がつかない
// Type 'PolicyType' does not conform to protocol 'BaseTreeNodePolicy'
let descendant = ChildType(generator: generator, maxDepth: maxDepth - 1)
final class SequenceNode<ChildType: ActionNode<PolicyType>, PolicyType: BaseTreeNodePolicy>: ActionNode<PolicyType> {
public var sequence: [ChildType] = []
// ...
public override func addRandomDescendants(generator: EntropyGenerator, maxDepth: Int) {
// ...
sequence.reserveCapacity(42)
// ...
let descendant = ChildType(generator: generator, maxDepth: maxDepth - 1)
// ...
}
}
SequenceNode
をコンパイルし、私はこの行のコンパイルエラーを取得しますChildType: ActionNode<PolicyType>
とPolicyType: BaseTreeNodePolicy
が宣言のヘッダー部分にあります。
何が間違っている可能性がありますか?
ありがとうございます! Petr。
、これを試してみてください。 – BaseZen
良い解決策ですが、 'ChildType'を' ActionNode 'のサブクラスにしたいのですが? –
OK、やり直しますが、思考にシフトが必要です。 – BaseZen