我正在做一些非常简单的事情只是为了习惯Swift(来自objc) - 我想通过使用guard
语句和switch
语句在链表中返回所需的节点。我显然是在滥用guard
语句,因为我的else
子句很大(这是我保留switch语句的地方)。也许我甚至不需要switch
声明,但它只是稍微清理一下。
我的旧代码如下:
func getValue (atIndex index: Int) -> T {
if count < index || index < 0 {
print ("index is outside of possible range")
}
var root = self.head
// if var root = self.head {
if index == 0 {
return (self.head?.value)!
}
if index == count-1 {
return (self.tail?.value)!
}
else {
for _ in 0...index-1 {
root = root!.next!
}
}
return root!.value
}
替换为guard
语句(但是获得了防护体可能无法通过的编译器错误) - 我的问题是返回什么,因为我的函数返回类型是<T>
(任何类型) 。
func getValue (atIndex index: Int) -> T {
guard (count < index || index < 0) else {
switch true {
case index == 0:
if let head = self.head {
return head.value
}
case index == count-1:
if let tail = self.tail {
return tail.value
}
default:
if var currentNode = head {
for _ in 0...index-1 {
currentNode = currentNode.next!
}
return currentNode.value
}
}
}
}
我想在print
语句之外添加一个guard
语句,说明所需的索引超出了范围,但我还需要在函数末尾返回一些内容。输入T
。问题是在guard
和switch语句之外,我没有任何回报。
答案 0 :(得分:2)
guard
语句用于捕获无效案例,因此您需要以下内容:
func getValueAtIndex(index: Int) -> T {
guard index >= 0 && index < count else {
// Invalid case
print("Index is outside of possible range")
// Guard must return control or call a noreturn function.
// A better choice than the call to fatalError might be
// to change the function to allow for throwing an exception or returning nil.
fatalError("Index out of bounds")
}
// Valid cases
}
答案 1 :(得分:0)
guard
语句用于将程序移出其当前范围,或者如果发现值为noreturn
,则调用nil
函数。但是,您正在switch
中运行整个guard
语句。
根据Apple's Guard Documentation:
else
语句的guard
子句是必需的,并且必须调用标有noreturn
属性的函数,或者使用其中一个来调用guard语句的封闭范围之外的程序控制以下陈述:
- 返回
- 断裂
- 继续
- 掷
guard
的一个很好的例子可能是:
var optValue : String?
guard let optValue = optValue else {return}