elements
- это массив типа T
. Свойство last
является необязательным, поскольку оно возвращает nil
, когда массив (или коллекция в целом) пуст. Таким образом, self.elements.last
не является обязательным для проектирования: T?
.
Но ваша peek()
функция ожидает T
в качестве возвращаемого значения:
public func peek() -> T {
return self.elements.last
}
Все, что вам нужно сделать, это изменить возвращаемое значение peek на T?
, поскольку для просмотра в пустое Stack
должно быть nil
.
Относительно " Являются ли дженерики необязательными по умолчанию? ":
T
может быть любым типом, о котором вы только могли подумать, в конце концов, он универсален. Например, вы можете выбрать T
как Int?
:
let s = Stack<Int?>()
let last = s.peek()
type(of: last) //Optional<Optional<Int>>.Type
В этом случае last
- это Int??
, который является ничем иным, как T?