Мой первый охранник, здесь уместно?

Я играю со Swift 2, и я просматриваю свой код для случаев, когда я защищаю, и я мог бы хотеть использовать guard, Вот один...

var mods : String = ""
let modpath = NSBundle.mainBundle().pathForResource(filename, ofType: "ini", inDirectory: "mods/gamedata")
if modpath?.length > 0 {
    mods = try! String(contentsOfFile: modpath!, encoding: NSUTF8StringEncoding)
} else {
    mods = ""
}

Цель этого кода - прочитать содержимое текстового файла в mods, Этот файл может существовать или не существовать, поэтому я хочу проверить, существует ли он, прежде чем пытаться прочитать его содержимое.

Это подходящее место для использования guard? Похоже, он имеет только else синтаксис, а не then сторона, так что вы не можете напрямую соответствовать этому синтаксису. Я мог бы установить моды на "" в начале и затем защитить чтение, но мне не ясно, действительно ли это улучшает читабельность?

В качестве примечания, я нахожу очень странным, что выбрасывает String (contentsOfFile), а bundle.pathForResource() просто возвращает nil. Я предпочитаю позже.

3 ответа

Вы можете использовать 'guard' вот так, в этом случае:

var mods : String = ""
guard let modpath = NSBundle.mainBundle().pathForResource(filename, ofType: "ini", inDirectory: "mods/gamedata") else {
    mods = ""
}
do
{
    mods = try String(contentsOfFile: modpath!, encoding: NSUTF8StringEncoding)
} 
catch ()
{

}

В этой ситуации я бы предложил использовать троичный оператор:

let modpath = NSBundle.mainBundle().pathForResource(filename, ofType: "ini", inDirectory: "mods/gamedata")
let mods = modpath?.length > 0  ? try! String(contentsOfFile: modpath!, encoding: NSUTF8StringEncoding) : ""

С другой стороны, вы даже не можете использовать guard в этом случае, потому что блок else должен выйти из области действия с return, break, continue или же throw

Здесь, используя Guard, я изменил ваш код, как показано ниже. это сокращает количество строк кода, и наша цель также ясна. проверьте этот код

var mods : String = ""

let modpath = NSBundle.mainBundle().pathForResource(filename, ofType: "ini", inDirectory: "mods/gamedata")

 guard modpath?.length > 0 else { throw ErrorHandler.errorMessage }

mods = try! String(contentsOfFile: modpath!, encoding: NSUTF8StringEncoding)

Здесь у вас есть определение enum (обработчик ошибок), который расширяется из протокола ErrorType.

Другие вопросы по тегам