私は、Objective-C でアーリー リターン/ゴールデン パスを使用してコードを記述することに慣れています。!
私は Swift でこのアプローチを試してみましたが、オプションが関係している場合、強制的なアンラップ演算子 ( ) を使用することを犠牲にして早期復帰が行われることに気付きました。
ディレクトリのサイズを計算する方法を取ります。まず、ゴールデン パス バージョン:
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;
}
変数と変数!
の両方に演算子を使用していることに注意してください。contents
attributes
!
演算子を使いすぎると、オプションの目的とそれらがもたらす型の安全性が損なわれると思います。これは、強制的なアンラップを回避するために、上記のメソッドを Swift でコーディングする必要があると私が感じる方法です。
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
することで早戻しができなくなります。アーリー リターンを使用しないメソッドと使用するメソッドがある場合、コーディング スタイルが混在するプロジェクトになってしまいます。
私の質問は、オプショナルが関係している場合に、強制的なアンラップに頼らずにゴールデン パス スタイルでコーディングする方法はありますか?