在操场上实现堆栈数据集合的格式副本时,我注意到编译器不允许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
}
}
最佳答案
elements
是T
类型的数组。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?