Class 在泛型类中使用泛型协议

Class 在泛型类中使用泛型协议,class,generics,swift,constraints,protocols,Class,Generics,Swift,Constraints,Protocols,我定义了一个协议LLNodeType: protocol LLNodeType { typealias T var firstNode: LLNode<T>? { get } } extension LLLinkedList: LLNodeType { typealias T = L var firstNode: LLNode<T>? { return self.rootNode } } convenienc

我定义了一个协议
LLNodeType

protocol LLNodeType {
    typealias T
    var firstNode: LLNode<T>? { get }
}
extension LLLinkedList: LLNodeType {
    typealias T = L

    var firstNode: LLNode<T>? {
         return self.rootNode
    }
}
convenience init<NT: LLNodeType where NT.T == L>(nodeSequence: NT) {
    self.init()
    self.rootNode = nodeSequence.firstNode
}
为了符合
LLNodeType
协议,我将
LLNode
扩展如下:

extension LLNode: LLNodeType {
    typealias T = N

    var firstNode: LLNode<T>? {
        return self
    }
}
我扩展了这个类以符合
LLNodeType

protocol LLNodeType {
    typealias T
    var firstNode: LLNode<T>? { get }
}
extension LLLinkedList: LLNodeType {
    typealias T = L

    var firstNode: LLNode<T>? {
         return self.rootNode
    }
}
convenience init<NT: LLNodeType where NT.T == L>(nodeSequence: NT) {
    self.init()
    self.rootNode = nodeSequence.firstNode
}
append
方法的第一条语句所示,我还为
LLLinkedList
定义了一个初始值设定项,它采用
LLNodeType
类型的参数
nodeSequence

protocol LLNodeType {
    typealias T
    var firstNode: LLNode<T>? { get }
}
extension LLLinkedList: LLNodeType {
    typealias T = L

    var firstNode: LLNode<T>? {
         return self.rootNode
    }
}
convenience init<NT: LLNodeType where NT.T == L>(nodeSequence: NT) {
    self.init()
    self.rootNode = nodeSequence.firstNode
}
501:33
引用了
append
方法的第一条语句

如果我用一个名为
nodeSequence
的参数定义了初始值设定项,怎么会有一个
额外的参数'nodeSequence'


下面是一个代码示例,仅包含与问题相关的部分:

问题在于,您的
append
函数没有为要追加的序列强制使用
LLNodeType.T
类型:

func append<NT: LLNodeType>(nodeSequence: NT) {
    // here, nodeSequence could be of a String, an Int, who knows...
    let nodes = LLLinkedList(nodeSequence: nodeSequence) 
    ...
    // but here you try to append it to the existing list...
    // what if it's not a list of the same type?
    if self.isEmpty {
        self.rootNode = nodes.rootNode
    } else {
    /// appends a node by pointing the last nodes pointer ('nextNode' property) to the new node
        self.lastNode!.nextNode = nodes.rootNode
    }
}
func追加(节点序列:NT){
//这里,nodeSequence可以是一个字符串,一个Int,谁知道呢。。。
let nodes=LLLinkedList(nodeSequence:nodeSequence)
...
//但在这里,您尝试将其附加到现有列表中。。。
//如果不是同一类型的列表呢?
如果我是空的{
self.rootNode=nodes.rootNode
}否则{
///通过将最后一个节点指针('nextNode'属性)指向新节点来追加节点
self.lastNode!.nextNode=nodes.rootNode
}
}
您可以通过强制只附加与您的代码类型相同的序列来解决此问题

func append<NT: LLNodeType where NT.T == L>(nodeSequence: NT) {
    // etc...
func追加(节点序列:NT){
//等等。。。

你能提供一整块可以剪切/粘贴到操场上的代码吗?否则别人就很难重现你的问题了。我刚刚试过把你问题中的代码整合起来(加上一些调整,比如给
LLNode
一个
init
)编译正常。不要太在意错误消息,Swift错误消息有时会有点误导。基本上,它所做的是告诉您为什么它不能使用
init()
method,由于其他原因,排除了您的便利方法,因此没有提及。我在问题的底部添加了一个链接。正如它所说,它只包含与问题相关的部分。如果您真的喜欢,我可以发布整个代码块,但这大部分是不相关的。到您实际代码的链接给了我所需要的d要想弄清楚为什么它不起作用——你在问题中发布的内容不起作用。总是尝试在问题中输入足够的代码,以便在可能的情况下轻松重现问题——你很少会从代码中得到好的答案。人们不需要写更多的代码就很难尝试……谢谢你的建议!完美地解决了问题!