Я привык писать код с ранним возвратом/золотым путем в 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
, я больше не могу досрочно возвращаться. Если некоторые методы не используют ранний возврат, а некоторые используют, то я получаю проект со смешанным стилем кодирования.
Мой вопрос: есть ли способ кодировать в стиле золотого пути, не прибегая к принудительной распаковке, когда задействованы необязательные параметры?
private
! - person zaph   schedule 25.08.2014