我的第一个警卫,这是否合适?

时间:2015-06-23 17:35:57

标签: swift2 guard-statement

我正在玩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方,因此您无法直接匹配此语法。我可以将mod设置为""在开始时然后保护阅读,但我不清楚这真的提高了可读性吗?

作为旁注,我发现String(contentsOfFile)抛出非常奇怪,而bundle.pathForResource()只返回一个nil。我更喜欢后者。

3 个答案:

答案 0 :(得分:0)

在这种情况下,我建议使用三元运算符:

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

另一方面,在这种情况下你甚至不能使用guard,因为else块必须使用returnbreakcontinue或{{1}退出范围}}

答案 1 :(得分:0)

你可以使用' 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 ()
{

}

答案 2 :(得分:0)

在这里,使用 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)

这里定义了从ErrorType协议扩展的枚举(错误处理程序)。