在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
}
}
答案 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??