如何在 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 分配委托?