问题描述
我习惯于在Objective-C中使用早期返回/黄金路径编写代码。我在Swift中尝试了这种方法,并注意到早期返回是以涉及可选参数时使用强制解包运算符(!
)为代价的。
I'm used to write code with early return/golden path in Objective-C. I tried this approach in Swift, and noticed that early return comes at the expense of using the forced unwrapping operator (!
) when optionals are involved.
使用一个计算目录大小的方法。首先,黄金路径版本:
Take a method that calculates the size of a directory. First, the golden path version:
private func calculateSize_GoldenPath(directory:String) -> UInt64 {
let fileManager = NSFileManager.defaultManager()
var error : NSError?
var contents = fileManager.contentsOfDirectoryAtPath(directory, error: &error) as [String]?
if contents == nil {
NSLog("Failed to list directory with error \(error)")
return 0
}
var size : UInt64 = 0
for pathComponent in contents! {
let path = directory.stringByAppendingPathComponent(pathComponent)
let attributes : NSDictionary? = fileManager.attributesOfItemAtPath(path, error: &error)
if (attributes == nil) {
NSLog("Failed to read file size of \(path) with error \(error)")
continue
}
size += attributes!.fileSize()
}
return size;
}
注意我如何使用 code>内容
和属性
变量
我假设过度使用!
操作符会破坏可选项的目的和它们带来的类型安全性。这是我觉得上面的方法应该编码在Swift,以避免强制解开:
I'm assuming that overusing the !
operator kind of defeats the purpose of optionals and the type safety they bring. This is how I feel the above method should be coded in Swift to avoid forced unwrapping:
private func calculateSize_IfLet(directory:String) -> UInt64 {
let fileManager = NSFileManager.defaultManager()
var error : NSError?
if let contents = fileManager.contentsOfDirectoryAtPath(directory, error: &error) as? [String] {
var size : UInt64 = 0
for pathComponent in contents {
let path = directory.stringByAppendingPathComponent(pathComponent)
if let attributes : NSDictionary = fileManager.attributesOfItemAtPath(path, error: &error) {
size += attributes.fileSize()
} else {
NSLog("Failed to read file size of \(path) with error \(error)")
}
}
return size
} else {
NSLog("Failed to list directory with error \(error)")
return 0
}
}
但是,使用 if let
我不能早早回报了。如果一些方法不使用早期返回和一些做,那么我最终得到一个混合编码风格的项目。
However, by using if let
I can't do early return anymore. If some methods don't use early return and some do, then I end up with a project with mixed coding style.
我的问题是,有一种方法来代码
My question is, is there a way to code in golden path style without resorting to forced unwrapping when optionals are involved?
推荐答案
我个人会使用提取方法,在这种情况下将pathComponent段提取到一个单独的方法中,从而避免多个缩进和笨拙的代码在概念上将代码分离在一起。
Personally I would use extraction of methods, in this case extract the pathComponent section into a separate method thus avoiding the multiple indent and awkward code that mashes conceptually separate code together.
private func calculateSize_IfLet(directoryPath:String) -> UInt64 {
var size : UInt64 = 0
let fileManager = NSFileManager.defaultManager()
var error : NSError?
if let contents = fileManager.contentsOfDirectoryAtPath(directoryPath, error: &error) as? [String] {
size = self.calculateSizeOfDirectory(directoryPath, contents:contents)
} else {
NSLog("Failed to list directory with error \(error)")
}
return size
}
private func calculateSizeOfDirectory(directoryPath:String, contents:[String]) -> UInt64 {
var size : UInt64 = 0
for pathComponent in contents {
var error : NSError?
let fileManager = NSFileManager.defaultManager()
let path = directoryPath.stringByAppendingPathComponent(pathComponent)
if let attributes : NSDictionary = fileManager.attributesOfItemAtPath(path, error: &error) {
size += attributes.fileSize()
} else {
NSLog("Failed to read file size of \(path) with error \(error)")
}
}
return size
}
这篇关于早期回报/金色路径在Swift的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!