我发现我的代码绝对充满了可选内容和警卫/警惕的声明。
一个例子是,我有一个在几个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)
}
每当我使用可选选项时,尤其是在类对象中使用可选选项时,我都会在代码中发现这些问题。
一个答案建议我增加进一步的复杂性,以检查是否已设置该方法...这会使我的代码更加不可读。有什么方法可以批量解开课程吗?还是可以尝试/捕捉?
我该如何改善?
这是一个“构建者”问题,它有一些解决方案。
一种是将可变结构与不变结构分开。使用具有var
可选值的可变RequestBuilder进行构建。然后,完成后,将其转换为具有let
非可选值的不可变请求。这将迫使您if-let
一次做这个巨人,但随后它会完成。
另一个是为所有值提供默认值。通常,集合(包括字符串)不应是可选的。只是将它们清空。
默认值几乎无法使用,每个字段都是必需的