将Result<FAQResult>强制转换为FAQResult时崩溃,求解决方案
解决Result转FAQResult崩溃的问题
嗨,这个问题我之前也踩过坑!你直接用as!强制转换肯定会崩溃,因为Result<FAQResult>是一个枚举容器类型,它本身并不是FAQResult——它内部包含两种状态:.fulfilled(FAQResult)(成功时携带数据)和.rejected(Error)(失败时携带错误),这俩类型完全不相关,所以强转才会触发那个“always fails”的错误提示。
根据你提供的Core-Promise库的Result枚举定义,正确的做法是通过枚举模式匹配来提取内部的FAQResult,而不是强制转换。这里给你两种可行的方案:
方案1:完整处理成功/失败场景(推荐)
用switch语句覆盖Result的所有case,既处理成功的情况,也处理错误,避免潜在的崩溃:
when(resolved: task).then { (result) -> Void in guard let singleResult = result.first else { // 处理result为空的情况,比如打印日志或者提示用户 print("没有获取到结果") return } switch singleResult { case .fulfilled(let faqResult): // 这里安全拿到了FAQResult self.fAQS = faqResult.result ?? [] // 建议用??避免强制解包nil case .rejected(let error): // 处理请求失败的情况,比如打印错误信息 print("请求失败:\(error.localizedDescription)") } }
方案2:仅处理成功场景(适合确定不会失败的情况)
如果你的业务逻辑能保证这个请求一定成功,可以用if case模式匹配快速提取数据:
when(resolved: task).then { (result) -> Void in guard let singleResult = result.first else { print("没有获取到结果") return } if case .fulfilled(let faqResult) = singleResult { self.fAQS = faqResult.result ?? [] } else { // 还是建议在这里加个错误处理,哪怕只是日志 print("请求结果是失败状态") } }
额外提醒:
不要用!强制解包faqResult.result,如果后端返回的result是nil,这里又会崩溃,用?? []给个默认空数组会更安全。
内容的提问来源于stack exchange,提问作者iCappsCVA
相关产品推荐
相关产品推荐

