Общие типы связанного списка Swift 4: Невозможно сравнить два общих значения - PullRequest
0 голосов
/ 19 января 2019

Я пытаюсь реализовать связанный список на игровых площадках Swift, используя общие типы.Моя функция удаления дает мне ошибки при сравнении с универсальными типами, даже если они эквивалентны.

Я уже пытался соответствовать протоколам Equatable и Comparable в моем объявлении функции, но ошибки все еще сохраняются.

class Node<T> {

    var value:T
    var next:Node?

    init(value:T) {
        self.value = value
        self.next = nil
    }

}

func remove<T: Equatable>(value:T) -> Node<T>? {
    if isEmpty {
        return nil

    }
    else {
        var current = head!
        var prev:Node<T>? = nil

        while (current.value != value && current.next != nil) {
            prev = current
            current = current.next!
        }

        if (current.value == value) {
            //Found node. Remove by updating links, return node
            if let prev = prev {
                prev.next = current.next
                current.next = nil
            }
            else {
                self.head = current.next
                current.next = nil
            }

            size -= 1
            return current
        }
        else {
            return nil
        }
    }
}

В этой строке моей функции удаления:

while (current.value != value && current.next != nil) {

Я получаю сообщение об ошибке:

Binary operator '!=' cannot be applied to operands of type 'T' and 'T'

Также, когда я соответствую Equatable, я получаю эту ошибку в следующей строке при попытке обновить предыдущий узел:

Cannot assign value of type 'Node<T>' to type 'Node<T>?'

Эта ошибка исчезнет при удалении протокола Equatable.

Есть идеи?Похоже, мне не хватает простого шага при соответствии протоколам, но я не уверен, что не хватает ... Заранее спасибо!

1 Ответ

0 голосов
/ 19 января 2019

Соответствие Equatable должно быть добавлено и к самому универсальному классу, а не только для функции, например:

class Node<T: Equatable > {
    // Your code here.
}

Говоря current.value != value, вы пытаетесь сравнить current.value с value. На этом этапе компилятор уверен, что value соответствует Equatable, но он не уверен, что current.value соответствует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...