Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 符合Swift中可比标准的通用类_Generics_Swift_Comparable_Iequatable - Fatal编程技术网

Generics 符合Swift中可比标准的通用类

Generics 符合Swift中可比标准的通用类,generics,swift,comparable,iequatable,Generics,Swift,Comparable,Iequatable,我试图创建一个简单的通用节点类,它符合可比较协议,这样我就可以轻松地比较节点,而无需访问它们的密钥。然而,当我尝试编写

我试图创建一个简单的通用节点类,它符合可比较协议,这样我就可以轻松地比较节点,而无需访问它们的密钥。然而,当我尝试编写<和==函数时,编译器似乎不喜欢它。<和==函数在定义节点参数时需要一个类型。这在Java中很简单,您在类内部定义了等式和<。斯威夫特在全球范围内提出了这一要求。有什么想法吗

例如:

func < (lhs:Node<E:Comparable>, rhs:Node<E:Comparable>) -> Bool {
    return lhs.key < rhs.key
}


func == (lhs:Node<E:Comparable>, rhs:Node<E:Comparable>) -> Bool {
    return lhs.key == rhs.key
}


class Node<D:Comparable>: Comparable {

    var key: D!
    var next:Node?
    var prev:Node?

    init( key:D ) {

        self.key = key
    }
}
func<(左:节点,右:节点)->Bool{
返回左键<右键
}
func==(左:节点,右:节点)->Bool{
返回lhs.key==rhs.key
}
类节点:可比较{
变量键:D!
下一步:节点?
var-prev:节点?
初始化(键:D){
self.key=key
}
}

你就快到了!Node类已经指定,对于
节点
D
必须符合
可比
。因此,
=
节点是冗余的。相反,您希望限制可以调用运算符的类型:/p
预失效Bool{
返回左键<右键
}
func==(左:节点,右:节点)->Bool{
返回lhs.key==rhs.key
}
类节点:可比较{
变量键:D!
下一步:节点?
var-prev:节点?
初始化(键:D){
self.key=key
}
}

你们非常接近。小语法问题请尝试以下方法:

class Node<D:Comparable>: Comparable {

    var key: D!
    var next:Node?
    var prev:Node?

    init( key:D ) {

        self.key = key
    }

}

func < <E:Comparable> (lhs:Node<E>, rhs:Node<E>) -> Bool {
    return lhs.key < rhs.key
}

func == <E:Comparable> (lhs:Node<E>, rhs:Node<E>) -> Bool {
    return lhs.key == rhs.key
}
类节点:可比较{
变量键:D!
下一步:节点?
var-prev:节点?
初始化(键:D){
self.key=key
}
}
func<(左:节点,右:节点)->Bool{
返回左键<右键
}
func==(左:节点,右:节点)->Bool{
返回lhs.key==rhs.key
}

事实上,我在前面尝试过,编译器抱怨“使用了未声明的标识符类型‘E’”。我还尝试用AnyObject替换泛型参数:可比但没有骰子。
class Node<D:Comparable>: Comparable {

    var key: D!
    var next:Node?
    var prev:Node?

    init( key:D ) {

        self.key = key
    }

}

func < <E:Comparable> (lhs:Node<E>, rhs:Node<E>) -> Bool {
    return lhs.key < rhs.key
}

func == <E:Comparable> (lhs:Node<E>, rhs:Node<E>) -> Bool {
    return lhs.key == rhs.key
}