0

我正在使用 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侧面,所以你不能直接匹配这个语法。我可以在开始时将 mods 设置为“”,然后保护读取,但我不清楚这是否真的提高了可读性?

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

4

3 回答 3

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 块必须使用return,或breakcontinuethrow

于 2015-06-24T01:30:02.423 回答
0

在这种情况下,您可以在此处使用这样的“守卫”:

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 ()
{

}
于 2015-06-30T04:03:48.133 回答
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 协议扩展的枚举(错误处理程序)。

于 2015-09-29T06:50:45.607 回答