我一直在试图弄清楚到底是怎么回事。我已经尽可能地精炼了代码,但是如果我在项目中进行操作,但仍然得到“运算符&&的结果未使用警告(即使已使用),但复制到Playground的相同代码也可以正常工作而没有警告。这只是一些伪代码,在我尝试查找问题时再次重写了基本代码之后。
enum WordError: Error {
case tooShort
case tooLong
}
func isTooShort(_ word: String) throws -> Bool {
if word.count < 3 { throw WordError.tooShort }
return true }
func isTooLong(_ word: String) throws -> Bool {
if word.count > 5 { throw WordError.tooLong }
return true }
func check(_ word: String) {
do {
try isTooShort(word) && isTooLong(word)
print(word)
} catch let error as WordError {
print("\(error)")
} catch {
}
}
这只是一个错误还是我在这里做错了什么?
我认为如果使用,我可以将警告静音:
try _ = isTooShort(word) && isTooLong(word)
但是我不确定这是否是“修补”它的正确方法。
答案 0 :(得分:3)
那样做没有错。当诸如isTooShort
之类的东西属于您并且您想要调用它而不捕获结果时,“正确”的方法是将其标记为@discardableResult
。如果这样做的话,你可以写
do {
try isTooShort(word)
try isTooLong(word)
print(word) // if we get here, it's neither too short nor too long
} catch ...
但是在这种情况下,您所做的也是“正确的”。
real 问题是为什么您都同时返回Bool 并引发错误。您对isTooShort
的实现很奇怪。您似乎在滥用throw
。目前尚不清楚您要通过以这种奇怪的方式实现它来解决什么问题。 isTooShort
只能以一种方式失败:单词太短。那么为什么不返回布尔呢? isTooShort
问一个简单的是/否问题,因此只需回答:返回布尔并停止。
如果您的目标是回答一个三个方式的问题-即告诉呼叫者此单词是太短,太长还是恰好正确,那么再次返回一个自定义枚举回答了这个问题:
enum WordLength {
case tooShort
case tooLong
case justRight
}
func howIs(_ word: String) -> WordLength {
if word.count < 3 { return .tooShort }
if word.count > 5 { return .tooLong }
return .justRight
}