我正在玩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。我更喜欢后者。
答案 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块必须使用return
,break
,continue
或{{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协议扩展的枚举(错误处理程序)。