我们应该使用“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)
}
当我们创建一个 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)
}