0

我不太清楚如何使用 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(),则会出现错误。如果有人可以向我展示一个代码来做我想做的事情,那将非常有帮助。我在编码方面仍然非常非常新,我知道的不多。不好意思给您添麻烦了!

4

2 回答 2

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()
于 2014-09-02T05:35:49.390 回答
0

您必须重载该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
    }
}

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

于 2014-09-02T05:45:07.913 回答