我用这种方式定义了一个闭包:
let processor: (MyBuffer) throws -> MyBuffer { buffer in
let outputBuffer = try? self.processBuffer(self, inputBuffer: buffer)
return outputBuffer
}
self.processBuffer()
如果无法输出有效的非nil缓冲区,则会引发异常。但是Swift编译器抱怨返回类型是可选的。我的问题是,应对这种情况的唯一正确方法是强行打开可选包装,否则有更好的处理方法?
答案 0 :(得分:1)
使用try
代替try?
。如果抛出processBuffer
,那么未关闭的错误将从您的闭包中抛出。否则,您将有一个有效的outputBuffer
返回。
let processor: (MyBuffer) throws -> MyBuffer = { buffer in
let outputBuffer = try self.processBuffer(self, inputBuffer: buffer)
return outputBuffer
}
答案 1 :(得分:0)
在这种情况下,缓冲区可能会失败,并且您的返回类型表示始终应返回缓冲区
可以尝试做很多事情,其中之一将返回类型更改为-> MyBuffer?
。
当您使用processor
时,可以使用guard let
或if let
使用!
强制展开会产生风险,就好像在任何时候如果值是nil
,应用都会崩溃
在Swift文档here
中了解有关可选链接的更多信息。答案 2 :(得分:0)
强制包装值可能很危险,因为它可能导致应用程序崩溃。
进行强制换行,当您确定(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.
答案 3 :(得分:0)
您可以再次引发异常或对其进行处理。
如果要处理它,则必须将代码包装到do-catch中,然后:
let processor: (MyBuffer) -> MyBuffer{ buffer in
do{
let outputBuffer = try self.processBuffer(self, inputBuffer: buffer)
return outputBuffer
}catch HERE_THE_ERROR_TYPE{
//HERE HOW TO HANDLE THE ERROR
}
}
此外,如果您要抛出错误,则:
let processor: (MyBuffer) throws -> MyBuffer{ buffer in
let outputBuffer = try self.processBuffer(self, inputBuffer: buffer)
return output
}
然后,您可以处理闭包调用中的错误,也可以再次抛出该错误。
现在,请注意,如果您的函数引发错误,则可以使用可选方法来处理它,就像您所做的一样。这意味着您必须处理或检查可选值(guard-let,if-let或您喜欢的值)。这就是为什么如果函数processBuffer引发错误,它将为outputBuffer分配一个nil值,这意味着您不需要throws声明:
let processor: (MyBuffer) -> MyBuffer?{ buffer in
let outputBuffer = try? self.processBuffer(self, inputBuffer: buffer)
//HERE YOU CAN CHECK IF OUTPUT_BUFFER IS NIL OR NOT
// Otherwise a nil value can be returned
return output
}
有关更多信息,请查看以下文档: Swift error handling