我有一个这样定义的闭包:
let processor: (MyBuffer) throws -> MyBuffer { buffer in
let outputBuffer = try? self.processBuffer(self, inputBuffer: buffer)
return outputBuffer
}如果self.processBuffer()不能输出有效的非空缓冲区,它将抛出异常。但是Swift编译器抱怨返回类型是可选的。我的问题是,处理这种情况的唯一正确方法是强制解包可选项,还是有更好的方法来处理它?
发布于 2018-09-21 19:43:39
使用try而不是try?。如果processBuffer抛出,那么未捕获的错误将从您的闭包中抛出。否则,您将返回一个有效的outputBuffer。
let processor: (MyBuffer) throws -> MyBuffer = { buffer in
let outputBuffer = try self.processBuffer(self, inputBuffer: buffer)
return outputBuffer
}发布于 2018-09-21 18:02:43
在这种情况下,缓冲区可能会失败,并且您的返回类型说明总是应该返回缓冲区,您可以尝试做很多事情,其中之一是将返回类型更改为-> MyBuffer?。
在使用processor时,可以使用guard let或if let
使用!强制展开是有风险的,因为在任何时候,如果值为nil,应用程序就会崩溃
阅读Swift documentation here中有关可选链接的更多信息
发布于 2018-09-21 18:11:57
强制包装值可能是危险的,因为它可能会导致应用程序崩溃。
强制换行,当你确定拍摄(100%)知道可选的将包含一个值在任何给定的时间。
let processor: (MyBuffer) throws -> MyBuffer? { buffer in
guard let outputBuffer = try? self.processBuffer(self, inputBuffer: buffer) else { return nil }
return outputBuffer
}要调用以下代码,您需要确保在使用之前获得了所需的buffer。
guard let buffer = try? processor else { // no buffer was processed, hence you don't proceed the control flow.
return
}
// you got processed buffer, hence use it.https://stackoverflow.com/questions/52441010
复制相似问题