0

guard我正在做一些非常简单的事情,只是为了习惯 Swift(来自 objc)——我想通过使用语句和语句在链表中返回所需的节点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,说明所需的索引超出了范围,但我还需要在 type 函数的末尾返回一些东西T。问题是在我的guard和 switch 语句之外,我没有什么可以返回的。

4

2 回答 2

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
}
于 2016-05-25T20:49:25.700 回答
0

guard语句旨在将程序移出其当前范围或在noreturn发现值为 时调用函数nil。但是,switch您在guard.

根据Apple 的 Guard 文档

语句的else子句guard是必需的,并且必须调用标有noreturn属性的函数或使用以下语句之一将程序控制转移到保护语句的封闭范围之外:

  • 返回
  • 休息
  • 继续

一个很好的例子guard可能是:

var optValue : String?

guard let optValue = optValue else {return}
于 2016-05-25T20:50:11.730 回答