滥用保护声明取代零检查

时间:2016-05-25 20:41:26

标签: swift linked-list swift2 switch-statement guard-statement

我正在做一些非常简单的事情只是为了习惯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语句之外,我没有任何回报。

2 个答案:

答案 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}