在Swift中比较泛型对象

在Swift中比较泛型对象,swift,object,Swift,Object,我正在学习Java中的数据结构课程,为了帮助自己学习Swift,我正在尝试完成我已经在Swift中用Java完成的相同作业。我在Swift中比较对象时遇到一些问题。在Java中,我有以下带有remove(E obj)方法的ArrayList类: 什么是正确的设置方法,以便我可以比较结构中的泛型对象?如果重要,则将通用数组声明为: var storage = [E]() 你差一点就成功了。对于E类型,您只需要遵守equalable协议,它应该可以正常工作。swift中的泛型类型可以遵守协议,以确

我正在学习Java中的数据结构课程,为了帮助自己学习Swift,我正在尝试完成我已经在Swift中用Java完成的相同作业。我在Swift中比较对象时遇到一些问题。在Java中,我有以下带有remove(E obj)方法的ArrayList类:

什么是正确的设置方法,以便我可以比较结构中的泛型对象?如果重要,则将通用数组声明为:

var storage = [E]()

你差一点就成功了。对于
E
类型,您只需要遵守
equalable
协议,它应该可以正常工作。swift中的泛型类型可以遵守协议,以确保您要传递的类型可以执行某些操作。在这种情况下,可以进行比较。这很好,因为您将无法将结构与不遵守协议的类型一起使用,这将减少由于意外方法导致的运行时错误

以下是我为摆脱警告所做的

struct ArrayLinearList<E: Equatable> {

    var currentSize = 0;
    var maxSize = 10;
    var storage = [E]();

    mutating func remove(obj: E) -> E? {

        if currentSize == 0 {
            return nil
        }

        for var i = 0; i < currentSize; i++ {
            if storage[i] == obj {
                let removedElement = storage[i]

                for var j = 1; j < currentSize-1; j++ {
                    storage[j] = storage[j+1]
                }

                currentSize--

                if currentSize < maxSize/4 {
                    shrinkStorage()
                }

                return removedElement

            }

        }

        return nil

    }

    func shrinkStorage() {

    }
}
struct ArrayLinearList{
var currentSize=0;
var maxSize=10;
var存储=[E]();
变异函数删除(obj:E)->E{
如果currentSize==0{
归零
}
对于var i=0;i
至于与协议接口的混淆,因为您没有定义自己的类型,所以不需要实现这些接口。您只需要关心两件事可以相等,因此拥有
就足以告诉编译器“嘿,这个函数适用于实现
equalable
接口的所有类型”。如果要使用创建的自定义类型并比较两个实例,则需要实现该类型的接口


希望这能有所帮助。

顺便说一句——既然你说你正在学习Swift,那么用范围语法编写for循环就更“像Swift了:
for i in 0。另外,做
.compareTo()
然后检查
==0
是愚蠢的,你应该总是做
.equals()
。是的,这完全有道理。所以,如果我在做一个有序列表,我可能会写一个继承自equalable的struct ArrayLinearList,对吗?是的,就是这样。供参考
if storage[i] == obj {

Cannot invoke '==' with an argument list of type '($T6,E)'
var storage = [E]()
struct ArrayLinearList<E: Equatable> {

    var currentSize = 0;
    var maxSize = 10;
    var storage = [E]();

    mutating func remove(obj: E) -> E? {

        if currentSize == 0 {
            return nil
        }

        for var i = 0; i < currentSize; i++ {
            if storage[i] == obj {
                let removedElement = storage[i]

                for var j = 1; j < currentSize-1; j++ {
                    storage[j] = storage[j+1]
                }

                currentSize--

                if currentSize < maxSize/4 {
                    shrinkStorage()
                }

                return removedElement

            }

        }

        return nil

    }

    func shrinkStorage() {

    }
}