误用 guard 语句代替 nil 检查
Misuse of guard statement to replace nil checking
我正在做一些非常简单的事情,只是为了习惯 Swift(来自 objc)- 我想 return 通过使用 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
语句(但出现编译器错误,即守卫主体可能无法通过)- 我的问题是 return,因为我的函数 return 类型是 <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
}
}
}
}
我想在我的 guard
语句之外添加一个 print
语句,说明所需的索引超出范围,但我还需要 return T
类型的函数结束。问题是在我的 guard
和 switch 语句之外,我没有任何东西可以 return.
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
}
guard
语句旨在将程序移出其当前范围,或者如果发现值是 nil
则调用 noreturn
函数。但是,您 运行 是 guard
.
中的完整 switch
语句
根据Apple's Guard Documentation:
The else
clause of a guard
statement is required, and must either call a function marked with the noreturn
attribute or transfer program control outside the guard statement’s enclosing scope using one of the following statements:
- return
- break
- continue
- throw
guard
的一个很好的例子可能是:
var optValue : String?
guard let optValue = optValue else {return}
我正在做一些非常简单的事情,只是为了习惯 Swift(来自 objc)- 我想 return 通过使用 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
语句(但出现编译器错误,即守卫主体可能无法通过)- 我的问题是 return,因为我的函数 return 类型是 <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
}
}
}
}
我想在我的 guard
语句之外添加一个 print
语句,说明所需的索引超出范围,但我还需要 return T
类型的函数结束。问题是在我的 guard
和 switch 语句之外,我没有任何东西可以 return.
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
}
guard
语句旨在将程序移出其当前范围,或者如果发现值是 nil
则调用 noreturn
函数。但是,您 运行 是 guard
.
switch
语句
根据Apple's Guard Documentation:
The
else
clause of aguard
statement is required, and must either call a function marked with thenoreturn
attribute or transfer program control outside the guard statement’s enclosing scope using one of the following statements:
- return
- break
- continue
- throw
guard
的一个很好的例子可能是:
var optValue : String?
guard let optValue = optValue else {return}