误用 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}