@sportredwhite

Односвязный список swift, почему ошибка?

Объясните плз, почему после {55, 5.99} выводится nil, а не ссылка на следующей объект

class Link {
    private let iData: Int
    private let dData: Double
    public var next: Link!
    
    public init(iData: Int, dData: Double) {
        self.iData = iData
        self.dData = dData
    }
    
    public func displayLink() {
        print("{\(iData), \(dData)}")
    }
}

class LinkList {
    
    private var first: Link!
    
    public func isEmpty() -> Bool {
        return first == nil
    }
    
    // INSERT
    public func insertFirst(iData: Int, dData: Double) {
        let newLink = Link(iData: iData, dData: dData)
        newLink.next = first
        first = newLink
    }
    
    // DELETE
    public func deleteFirst() -> Link? {
        if var first = first {
            let temp = first
            first = first.next
            return temp
        }
        return nil
    }
    
    //Display
    public func displayList() {
        print("List (first --> last)")
        if let first = first {
            var current = first
            while current != nil {
                current.displayLink()
                current = current.next
                print(current.next) // Error {55, 5.99} nil
            }
        }
        print("----------")
    }
 
}


let theList = LinkList()
theList.insertFirst(iData: 22, dData: 2.99)
theList.insertFirst(iData: 55, dData: 5.99)
theList.insertFirst(iData: 77, dData: 7.99)

theList.displayList()
  • Вопрос задан
  • 925 просмотров
Решения вопроса 1
maximglobak
@maximglobak
iOS developer
1) .next не всегда обязан быть
например для элемента (iData: 22, dData: 2.99) у тебя нет .next, но в классе говорится, что он всегда есть.
Отсюда следует, что .next - опциональный тип
2) Тоже самое с .first в списке, он может быть или не быть. Вдруг ты все удалил и тогда будет краш.
3) Ошибка как раз и возникала из-за того, что пыталась взять .next, которого нет
Ниже исправил код с комментариями.
class Link {
  private let iData: Int
  private let dData: Double
  public var next: Link?

  public init(iData: Int, dData: Double) {
    self.iData = iData
    self.dData = dData
  }

  public func displayLink() {
    print("{\(iData), \(dData)}")
  }
}

class LinkList {

  private var first: Link?

  public func isEmpty() -> Bool {
    return first == nil
  }

  // INSERT
  public func insertFirst(iData: Int, dData: Double) {
    let newLink = Link(iData: iData, dData: dData)
    newLink.next = first
    first = newLink
  }

  // DELETE
  public func deleteFirst() -> Link? {
    // Проверяем есть ли первый элемент, иначе удалить ничего нельзя и мы возращаем nil
    guard let first = first else { return nil }
    // Если есть первый элемент, то ему присваиваем значение второго
    // Если второго нет, то ему присвоится значение nil
    // А это значит мы удалили все элементы в списке
    self.first = first.next
    return self.first
  }

  //Display
  public func displayList() {
    print("List (first --> last)")
    // Создаем стартовый элемент, который изначально равен первому
    // Это опциональный тип и может быть nil, так как первый элемент тоже может быть nil
    // Если вдруг мы все удалили
    var element = first
    // Потом сразу делаем проверку на nil
    // Если элемента нет, то и выводить ничего не будем
    while element != nil {
      element?.displayLink()
      element = element?.next
    }
    print("----------")
  }

}


let theList = LinkList()
theList.insertFirst(iData: 22, dData: 2.99)
theList.insertFirst(iData: 55, dData: 5.99)
theList.insertFirst(iData: 77, dData: 7.99)

//theList.deleteFirst()
//theList.deleteFirst()
//theList.deleteFirst()

theList.displayList()
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы