在操场上实现堆栈数据集合的格式副本时,我注意到编译器不允许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
    }

}

最佳答案

elementsT类型的数组。last属性是可选的,因为当数组(或集合)为空时,它返回nil。因此,self.elements.last在设计上是可选的:T?
但是peek()函数期望T作为返回值:

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

您只需将peek的返回值更改为T?,因为peek进入空的Stack应该是nil
至于“泛型在默认情况下是可选的吗?”:
T可以是任何你能想到的类型,毕竟它是通用的。例如,您可以选择T作为Int?
let s = Stack<Int?>()
let last = s.peek()
type(of: last)        //Optional<Optional<Int>>.Type

在这种情况下,last是一个Int??,除了T?

10-08 16:57