swift - do/try/catch 块中的“'&&'未使用的结果”警告
问题描述
我一直试图弄清楚发生了什么无济于事。我已经尽可能多地提炼了代码,但如果我在项目中执行此操作,我仍然会收到“运算符 && 的结果是未使用的警告(即使已使用)但复制到 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)
但我不确定这是否是“修补”它的正确方法。
解决方案
这样做并没有错。“正确”的方法是,当类似的东西isTooShort
属于你并且你想在不捕获结果的情况下调用它时,用 . 标记它@discardableResult
。如果你这样做了,那么你可以写
do {
try isTooShort(word)
try isTooLong(word)
print(word) // if we get here, it's neither too short nor too long
} catch ...
但在这种情况下,你所做的也是“正确的”。
真正的问题是为什么你会返回一个 Bool并抛出一个错误。你的实现isTooShort
很奇怪。你似乎在滥用throw
. 目前尚不清楚您以这种奇怪的方式实现它试图解决什么问题。isTooShort
只能失败一种方式:字太短。那么为什么它不只返回一个布尔值呢?isTooShort
问一个简单的是/否问题,所以只需回答它:返回一个 Bool 并停止。
如果您的目标是回答一个三方面的问题 - 即,告诉调用者这个词是太短、太长还是恰到好处,那么再次返回一个回答问题的自定义枚举:
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
}
推荐阅读
- java - JVM 将如何处理 Serializable 中的默认属性?
- java - 在 Java Spring 中解析 XML
- angular - Mute attribute in "mat-video" npm module
- android - 为什么 Android CursorAdapter 调用 3 次相同的操作
- c - Matrix of structure C
- git - Is it possible to auto git add files with VS Code as soon as they're created?
- java - 如何将应用设置为默认应用或让用户选择应用?
- python - 熊猫数据框列到子列
- loops - 更有效地使用游标循环,插入并提交每一行(Oracle)
- c++ - 避免在 C++ 中使用未定义的对象