用试试?运算符使代码更简洁
Use the try? operator to make the code more concise
我在 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)
为了简洁起见把警告放在那儿不好吗?
请注意,您收到这些警告是因为您正在调用某些方法并且您没有处理返回值。
如果您不需要返回值,那么您应该使用 let _ =
语法明确告诉阅读此代码的其他人有意忽略返回值。
否则,如果您应该处理返回值,但由于您太懒惰或其他原因而没有这样做,那么它被认为是您软件中的错误,您绝对不应该抑制它。
在Swift3中,忽略没有额外赋值的结果是合法的。这在 Xcode 8 GM:
中编译得很好,没有警告
try? FileManager.default.removeItem(atPath: destination)
(之前顺便在bugs.swift.org上问过这个,直接被告知这个_ = try?
语法被认为是正确的,并且要向编译器——以及你自己——承认你是故意忽略返回值而付出的代价很小。因此,当您留在 Swift 2 世界时,您所做的一切都很好!)
我在 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)
为了简洁起见把警告放在那儿不好吗?
请注意,您收到这些警告是因为您正在调用某些方法并且您没有处理返回值。
如果您不需要返回值,那么您应该使用 let _ =
语法明确告诉阅读此代码的其他人有意忽略返回值。
否则,如果您应该处理返回值,但由于您太懒惰或其他原因而没有这样做,那么它被认为是您软件中的错误,您绝对不应该抑制它。
在Swift3中,忽略没有额外赋值的结果是合法的。这在 Xcode 8 GM:
中编译得很好,没有警告try? FileManager.default.removeItem(atPath: destination)
(之前顺便在bugs.swift.org上问过这个,直接被告知这个_ = try?
语法被认为是正确的,并且要向编译器——以及你自己——承认你是故意忽略返回值而付出的代价很小。因此,当您留在 Swift 2 世界时,您所做的一切都很好!)