2014-06-14 79 views
1

像许多人一样,我正在学习Apple提供的新Swift语言,通过教程我遇到了一个创建通用堆栈的示例。下面是从例如弹出功能......简单堆栈示例,如果堆栈为空,如何返回?

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

我决定延长该实现当元素数组为空,但作为新的斯威夫特我不能确定什么返回如果堆栈为空时不会弹出。

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

我的问题是什么是斯威夫特

+1

我认为removeLast会给你'nil'如果堆栈是空的,这正是你应该返回什么时,堆栈是空的,所以没有必要的if-else语句。 –

+1

@LordZsolt:实际上,当数组为空时,我认为使用'removeLast'是一个运行时错误。在Swift中,一个类型(''在这种情况下)不能被设置为'nil'。只有输入“可选T”('T?')才能包含'nil'。如果编译代码,'removeLast'必须返回'T'而不是'T?',因为'T''不能以这种方式隐式转换为'T'。 –

+0

@AlvinThompson对不起,没有花足够的时间与斯威夫特...我有考试... –

回答

2

做到这一点的最好办法这正是自选是对的东西类型。选配是像普通的变量,除非他们有一个特殊的情况下说,“没有指定价值”,所以不是返回类型为“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 
} 
+0

谢谢阿尔文非常感谢,我正在完成第一个视频(402),并且我看到选项是在下一个(403)的开头:)再次感谢您花时间让我走上正确的轨道。 – fuzzygoat

+0

没问题。一旦你掌握了“无价值”案例,选择权是一种非常好的方式。我不得不承认,我花了一点时间来完全适应这个概念,因为我习惯于在Java和C++中使用“null”。但现在,我认为他们很棒。他们更清楚地表达了职能和客户的意图,而且他们确实更安全。 –

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