使用试试?运算符使代码更简洁

时间:2016-09-09 15:26:18

标签: swift error-handling swift2 try-catch

我在Swift 2中使用此代码将文件移动到新目的地,必要时覆盖:

let origin = "...", destination = "..."
do {
   try NSFileManager.defaultManager().removeItemAtPath(destination)  // remove existing file
} catch {}
do {
   try NSFileManager.defaultManager().moveItemAtPath(origin, toPath: destination)
} catch {}

为了使代码更简洁,并且由于我不关心抛出的错误,我想到使用try?运算符如下:

let origin = "...", destination = "..."
try? NSFileManager.defaultManager().removeItemAtPath(destination)
try? NSFileManager.defaultManager().moveItemAtPath(origin, toPath: destination)

这会创建一个编译器警告,表明操作的结果未被使用,所以我必须添加一个未使用的let,它看起来很糟糕:

...
let _ = try? NSFileManager.defaultManager().moveItemAtPath(origin, toPath: destination)

为了简明起见,在那里发出警告是不是很糟糕?

2 个答案:

答案 0 :(得分:3)

在Swift 3中,如果没有额外的赋值,忽略结果是合法的。这在Xcode 8 GM中编译得很好,没有任何警告:

try? FileManager.default.removeItem(atPath: destination)

(顺便说一句,顺便提一句,我在bugs.swift.org上询问了这个问题,直接告诉我_ = try? 语法被认为是正确的,并且为了向编译器(以及您自己)承认您故意忽略返回的值而付出的代价很小。所以当你留在Swift 2世界时,你正在做的就好了!)

答案 1 :(得分:0)

请注意,您有这些警告,因为您正在调用某个方法而不处理返回值。

如果您不需要返回值,那么您应该使用let _ =语法明确告诉读取此代码的其他人故意忽略返回值。

否则,如果你应该处理返回值,但你还没有这样做,因为你太懒或者其他原因那么它被认为是你软件中的一个错误,你绝对不应该压制它。