如何在 Swift 上为堆栈声明“如果可选”

Posted

技术标签:

【中文标题】如何在 Swift 上为堆栈声明“如果可选”【英文标题】:How to declare "if optional" on for a stack on Swift 【发布时间】:2014-09-02 05:01:22 【问题描述】:

我不太清楚如何使用 Swift 上的类在堆栈上声明“如果可选”。 这是我使用类在 Swift 上的堆栈的通用代码(本书使用结构,但我被告知使用类)。

class Stack 
    var items = [String]()
    func push(item: String) 
        items.append(item)
    
    func pop() -> String 
        return items.removeLast()
    
    func length() -> Int 
        return items.count
    

我创建了一个 Stack 实例:

var stringStack = Stack()
...
stringStack.pop()

当我弹出时,堆栈会删除最后一项。我想这样做,如果我执行 pop(0),堆栈将删除第一项,但如果我只执行 pop(),堆栈仅删除最后一项。我正在考虑使用 if ... return items.removeAtIndex(0) 或 else items.removeLast() 创建一个可选值。我似乎无法正确使用语法,并且不断出错。我能够做到这一点,以便 pop(0) 删除堆栈中的第一项,但如果我执行 pop(),则会出现错误。如果有人可以向我展示一个代码来做我想做的事情,那将非常有帮助。我在编码方面仍然非常非常新,而且我知道的不多。给您添麻烦了!

【问题讨论】:

【参考方案1】:

您正在寻找具有默认值可选参数。这样您就可以调用 pop() 来移除堆栈中的最后一项或调用 pop(index) 来移除特定项目。

使用参数调用pop 意味着可选的index 有一个值,因此使用第一个返回值。不带参数调用会使 index 保留其默认值,因此 if 语句将失败,您将删除最后一项。

func pop(_ index: Int? = nil) -> String 
    if let i = index 
        return items.removeAtIndex(i)
    

    return items.removeLast()

// ...
stack.pop(0)
stack.pop()

【讨论】:

【参考方案2】:

您必须重载 pop 函数,即创建 2 个具有不同签名的版本。我还建议返回一个可选的,因为如果数组为空,或者如果您要求它弹出一个不存在的项目,它将生成一个运行时异常。这是修改后的版本:

class Stack 
    var items = [String]()

    func push(item: String) 
        items.append(item)
    

    func pop() -> String? 
        return length() > 0 ? items.removeLast() : nil
    

    func pop(index: Int) -> String? 
        return index < length() ? items.removeAtIndex(index) : nil
    

    func length() -> Int 
        return items.count
    

Swift 与 Objective-C 相比,其中一个(最受赞赏的特性)新特性是泛型,那么为什么不在像堆栈这样的容器类中使用它呢?这里是:

class Stack<T> 
    var items = [T]()

    func push(item: T) 
        items.append(item)
    

    func pop() -> T? 
        return length() > 0 ? items.removeLast() : nil
    

    func pop(index: Int) -> T? 
        return index < length() ? items.removeAtIndex(index) : nil
    

    func length() -> Int 
        return items.count
    

通过这种方式,您可以重复使用它来存储任何类型的数据,而不仅限于字符串

【讨论】:

以上是关于如何在 Swift 上为堆栈声明“如果可选”的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3 - 如何在 .xib 文件上为 UIScrollView 分配委托?

在堆栈上为execve创建一个arg数组

如何在 Swift 中打印调用堆栈?

临时数据如何存储在堆栈帧上

如何在 Swift IOS 中创建具有多个堆栈视图的可滚动堆栈视图

如何在 Swift 中正确实现方向数组缩减挑战中的堆栈