Мой первый охранник, здесь уместно?
Я играю со 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.