编译器为什么不允许从peek方法返回的泛型不是可选的?

时间:2018-09-04 14:49:24

标签: ios swift generics

在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 :(得分:1)

sqlite3_open()是类型elements的数组。 T属性是可选的,因为当数组(或通常的集合)为空时,它返回last。因此,nil在设计上是可选的:self.elements.last

但是您的T?函数期望peek()作为返回值:

T

您要做的就是将peek的返回值更改为public func peek() -> T { return self.elements.last } ,因为窥视空的T?应该是Stack

关于“ 默认情况下泛型是否可选?”:

nil可以是您可以想到的任何类型,毕竟它是通用的。例如,您可以选择 T 作为 T

Int?

在这种情况下,let s = Stack<Int?>() let last = s.peek() type(of: last) //Optional<Optional<Int>>.Type last Int??