首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift闭包异常处理

Swift闭包异常处理
EN

Stack Overflow用户
提问于 2018-09-21 17:48:53
回答 4查看 173关注 0票数 0

我有一个这样定义的闭包:

代码语言:javascript
复制
 let processor: (MyBuffer) throws -> MyBuffer { buffer in

    let outputBuffer = try? self.processBuffer(self, inputBuffer: buffer)
    return outputBuffer

 }

如果self.processBuffer()不能输出有效的非空缓冲区,它将抛出异常。但是Swift编译器抱怨返回类型是可选的。我的问题是,处理这种情况的唯一正确方法是强制解包可选项,还是有更好的方法来处理它?

EN

回答 4

Stack Overflow用户

发布于 2018-09-21 19:43:39

使用try而不是try?。如果processBuffer抛出,那么未捕获的错误将从您的闭包中抛出。否则,您将返回一个有效的outputBuffer

代码语言:javascript
复制
let processor: (MyBuffer) throws -> MyBuffer = { buffer in

    let outputBuffer = try self.processBuffer(self, inputBuffer: buffer)
    return outputBuffer

}
票数 1
EN

Stack Overflow用户

发布于 2018-09-21 18:02:43

在这种情况下,缓冲区可能会失败,并且您的返回类型说明总是应该返回缓冲区,您可以尝试做很多事情,其中之一是将返回类型更改为-> MyBuffer?

在使用processor时,可以使用guard letif let

使用!强制展开是有风险的,因为在任何时候,如果值为nil,应用程序就会崩溃

阅读Swift documentation here中有关可选链接的更多信息

票数 0
EN

Stack Overflow用户

发布于 2018-09-21 18:11:57

强制包装值可能是危险的,因为它可能会导致应用程序崩溃。

强制换行,当你确定拍摄(100%)知道可选的将包含一个值在任何给定的时间。

代码语言:javascript
复制
let processor: (MyBuffer) throws -> MyBuffer? { buffer in
     guard let outputBuffer = try? self.processBuffer(self, inputBuffer: buffer) else { return nil }
     return outputBuffer
}

要调用以下代码,您需要确保在使用之前获得了所需的buffer

代码语言:javascript
复制
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.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52441010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档