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()