【问题标题】:Simple stack example, how to return if stack is empty?简单的堆栈示例,如果堆栈为空,如何返回?
【发布时间】:2014-06-14 16:48:47
【问题描述】:

像许多人一样,我正在从 Apple 学习新的 Swift 语言,通过教程我遇到了一个创建通用堆栈的示例。这是该示例中的 pop 函数...

mutating func pop() -> T {
        return elements.removeLast()
}

我决定将此实现扩展为在元素数组为空时不弹出,但作为 Swift 新手,我不确定如果堆栈为空时返回什么。

mutating func pop() -> T {
    if !elements.isEmpty {
        return elements.removeLast()
    } else {
        // return nothing?
}

我的问题是在 Swift 中最好的方法是什么

【问题讨论】:

  • 如果堆栈为空,我假设 removeLast 会给您nil,而这正是您在堆栈为空时应该返回的内容,因此不需要 if-else 语句。
  • @LordZsolt:实际上,我认为在数组为空时使用removeLast 是运行时错误。在 Swift 中,不能将类型(在这种情况下为 T)设置为 nil。只有类型“可选 T”(T?) 可以包含 nil。如果此代码编译,removeLast 必须返回T 而不是T?,因为T? 不能以这种方式隐式转换为T。
  • @AlvinThompson 抱歉,没有花足够的时间在 Swift 上……我要考试了……
  • @LordZsolt:我不得不承认,Swift 似乎是一种设计良好的语言。不过,我们将看看该评估是否会随着时间的推移而成立。 :)
  • @AlvinThompson 我可能会被标记为偏离主题的评论,但我已经阅读了 Swift 书中的几页 (50-100) 页,我也有点喜欢它。虽然 Haskell 风格的返回语法让我毛骨悚然,因为我将它与 Clean (另一种函数式编程语言,如 Haskell,但地球上的其他人除了我们的老师之外使用它)联系起来,这对我来说是很多挫折的根源.

标签: swift


【解决方案1】:

这正是可选项的用途。可选项类似于常规变量,只是它们有一种特殊情况,即“未分配值”,因此返回类型“可选 T”而不是返回类型“T”:

mutating func pop() -> T? {
    if !elements.isEmpty {
        return elements.removeLast() // return the last item on the stack
    } else {
        return nil // indicate there was nothing on the stack
    }
}

当然,在使用此功能时,您必须检查是否获得了实际值。您可以使用“if”语句或“if let”构造来做到这一点。如果你在一个名为optionalItem 的变量中有一个可选的,你可以使用类似if optionalItem { ... } 的东西。只有当optionalItem 有值时,才会执行if 块中的代码。

“if let”结构更进一步,为您从可选项中检索项目。执行以下操作:

if let item = myStack.pop() { // this implicitly unwraps the optional if present
    // Do something. "item" is of type T, not T?
else {
    // Nothing was on the stack. "item" is not defined
}

【讨论】:

  • 非常感谢 Alvin,我刚刚完成了第一个视频 (402),我看到选项位于下一个视频 (403) 的开头 :) 再次感谢您抽出宝贵时间我在正确的轨道上。
  • 没问题。一旦掌握了选项,选项是处理“无价值”情况的一种非常好的方法。我不得不承认,我花了一点时间来完全适应这个概念,因为我习惯于在 Java 和 C++ 中使用“null”。但现在我有了,我认为他们很棒。它们更清楚地表达了函数和客户端的意图,而且它们确实更安全。
【解决方案2】:
func pop() -> T? {
    if !elements.isEmpty {
        return elements.removeLast()
    } else {
        // return nothing?
        return nil
}
}

【讨论】:

    猜你喜欢
    • 2015-02-09
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    相关资源
    最近更新 更多