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

标签 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
    }

}

最佳答案

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

但是您的 peek() 函数需要 T 作为返回值:

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

您所要做的就是将 peek 的返回值更改为 T?,因为 peek 到一个空的 Stack 应该是 nil

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

T可以是你能想到的任何类型,毕竟它是通用的。例如,您可以选择 TInt?:

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/

相关文章:

ios - 在操作表中添加 UIPickerView 和一个按钮 - 如何?

ios - 如何使用swift绕过HTTPS服务器请求

swift - 当选择器更改时,SwiftUI 环境变量中的字符串插值未更新

c# - Windows 窗体设计器和通用窗体

java - Is n :1 observable:observer with generics possible in java?(观察者模式)

ios - 如何让一个操作等待另一个操作快速完成

ios - 我如何将 SFSafariViewController 与这个用户一样的深色主题一起使用?

ios - 格式化日期字符串 Swift 3 中的问题

java - Dozer 中泛型的深度映射

iphone - NSSortDestiptor 按 plist 编号排序时出错