温馨提示:本文翻译自stackoverflow.com,查看原文请点击:swift - best practice to escape from guard/let overuse and optionals
swift

swift - 避免守卫/过度使用和选装的最佳实践

发布于 2020-03-27 11:05:22

我发现我的代码绝对充满了可选内容和警卫/警惕的声明。

一个例子是,我有一个在几个VC中填充的对象,因此该对象中的变量是可选的。当我在函数中使用整个请求时,它会导致如下荒谬的事情:

func save(request: Request, completion: @escaping WebServiceResponse){
        guard let description = request.description,
            let totalAmount = request.totalAmount,
            let reserveAmount = request.reserveAmount,
            let holdingPeriod = request.holdingPeriod,
            let sender = request.sender,
            let receiver = request.receiver
            else {
                return
        }
        apiRequest(endpoint: apiEndpoint.Deal, path: "/save", body:
            [
                "description" : description,
                "total": totalAmount,
                "reserve": reserveAmount,
                "period":holdingPeriod,
                "from":sender,
                "to":receiver
            ], completion: completion)
    }

每当我使用可选选项时,尤其是在类对象中使用可选选项时,我都会在代码中发现这些问题。

一个答案建议我增加进一步的复杂性,以检查是否已设置该方法...这会使我的代码更加不可读。有什么方法可以批量解开课程吗?还是可以尝试/捕捉?

我该如何改善?

查看更多

查看更多

提问者
Code Wiget
被浏览
168
Rob Napier 2019-07-03 23:30

这是一个“构建者”问题,它有一些解决方案。

一种是将可变结构与不变结构分开。使用具有var可选值的可变RequestBuilder进行构建然后,完成后,将其转换为具有let非可选值的不可变请求这将迫使您if-let一次做这个巨人,但随后它会完成。

另一个是为所有值提供默认值。通常,集合(包括字符串)不应是可选的。只是将它们清空。