在 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
}
}
最佳答案
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?
关于ios - 为什么编译器不允许从 peek 方法返回的泛型不是可选的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52168949/