Почему компилятор не допускает, чтобы возвращаемый шаблон из метода peek не был необязательным? - PullRequest
0 голосов
/ 04 сентября 2018

При реализации представления сбора данных стека в Playground, я заметил, что компилятор не позволяет универсальному, возвращенному из метода peek, быть необязательным. Почему это? Обобщения являются необязательными по умолчанию?

public struct Stack<T> {
    private var elements = [T]()
    public init() {}

    public mutating func pop() -> T? {
        return self.elements.popLast()
    }


    public mutating func push(element: T){
        self.elements.append(element)
    }


    public func peek() -> T {
        return self.elements.last
    }


    public func isEmpty() -> Bool {
        return self.elements.isEmpty
    }


    public var count: Int {
        return self.elements.count
    }

}

1 Ответ

0 голосов
/ 04 сентября 2018

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?

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