Я пытаюсь объявить связанный список в Swift, с типом пальца, который является ссылкой либо на узел, позволяющий вставить или удалить за пределами этого узла, либо на сам связанный список, в этом случае вставка или удаление в верхняя часть связанного списка.
Я хочу посмотреть, можно ли сделать это единообразным вплоть до реализации, вместо того, чтобы разбираться во всем: в конце концов, Swift является объектно-ориентированным.
Ранее у меня была версия, которая требовала принудительного приведения, но я хотел бы еще раз посмотреть, можно ли сделать так, чтобы она работала без них (например, даже если они никогда не заканчиваются ошибками, они все равно подразумевают проверки во время выполнения).
У меня сейчас есть этот код:
protocol ContainerNodeInterface: class {
associatedtype ContainedItem;
var contents: ContainedItem { get };
}
protocol ParentNodeInterface: class {
associatedtype LinkedItem: ContainerNodeInterface;
var next: LinkedItem? {get set};
}
class ProtoNode<Contents, NodeType: ParentNodeInterface>: ParentNodeInterface where NodeType.ContainedItem==Contents, NodeType.LinkedItem==NodeType { // not meant to be instantiated or directly referenced
typealias LinkedItem = NodeType;
var next: NodeType?;
init() {
next = nil;
}
final func insertThisAfterMe(_ node: NodeType) {
node.next = next;
next = .some(node);
}
final func removeNodeAfterMe() -> NodeType? {
guard let nextNode = next else {
return nil;
}
let result = nextNode;
next = result.next;
result.next = nil;
return nextNode;
}
}
class Node<Contents>: ProtoNode<Contents, Node<Contents>>, ContainerNodeInterface {
typealias ContainedItem = Contents;
typealias NextItem = Node<Contents>;
var contents: Contents;
init(withContents: Contents) {
contents = withContents;
super.init();
}
}
typealias ParentNode<Contents> = ProtoNode<Contents, Node<Contents>>;
Но компилятор Swift через XCode жалуется, что Type 'Node<Contents>' does not conform to protocol 'ParentNodeInterface'
. Это не имеет никакого смысла! И если я добавлю явное соответствие ParentNodeInterface
к Node
, то получу одновременно эту ошибку и одно из избыточного соответствия одному и тому же протоколу.
Чего здесь не хватает?
Версия Xcode 10.2 (10E125), Swift 5