我们应该使用“else return”还是“return”?

Should we use `else return` or `return`?

当我们创建一个 return 是布尔值的函数时,我们是否应该在每个 if/else 语句上 return ?

例如,如果您想检查 swift 中是否存在某个文件,您可以执行

func fileExists() -> Bool
{
    if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first
    {
        let path = dir.appendingPathComponent("\(self.name).\(self.type)")
        if(FileManager.default.fileExists(atPath: path.path))
        {
            return true
        }
    }
    return false
}

问题是,如果满足上述条件,我们应该在函数末尾添加return false,还是应该在每个if语句上添加return false(如下所示)

func fileExists() -> Bool
{
    if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first
    {
        let path = dir.appendingPathComponent("\(self.name).\(self.type)")
        if(FileManager.default.fileExists(atPath: path.path))
        {
            return true
        } else {
            return false
        }
    } else {
        return false
    }
}

对我来说,第一个示例看起来更清晰,但我不确定这是不是一个好的做法。尽管它看起来更干净,但我想改用 best/safest 方式,所以这个问题不是关于什么看起来最好的意见。

虽然两者在这里都可以正常工作,但您应该使用其他 return 来更好地练习。它比第一个更安全,它还会增加您未来的代码范围

两个例子都会 return "true" 仅当条件

if(FileManager.default.fileExists(atPath: path.path))

满足了。

因为这是 returning "true" 的唯一方法,为了简单和可读性,我将使用第一个示例。 "else" 块是不必要的,因为如果不满足上述条件,您的函数将不可避免地 return "false"。

这个问题看起来几乎是一个纯粹基于意见的问题。但我确实知道一个包含您问题答案的通用函数模式。

函数应该:

  • 验证其参数;
  • 然后执行它的任务,负责错误处理并在无法成功时退出;
  • 然后计算并return其结果。

结果是一个非常线性的控制流,没有多余的嵌套。将此指南应用于您的代码:

func fileExists() -> Bool
{
    //If path exists, the variable dir will have a value. If not, bail out
    guard let dir = FileManager.default.urls(
        for: .documentDirectory,
        in: .userDomainMask
    ).first else {
        return false
    }

    let path = dir.appendingPathComponent("\(self.name).\(self.type)")

    // if(...) { return true; } else { return false; } pattern factored out
    return FileManager.default.fileExists(atPath: path.path)
}