我在Swift中发出了一个网址请求,并希望打印一个有意义的错误,包括响应代码,如果它们是一个。我尝试在尽可能少的代码行中执行此操作。我在XCode中遇到的错误如下:Variable declared in 'guard' condition not usable in its body
。
如何在不将代码膨胀到更多行的情况下执行以下操作,是否可能?
//check to see if we got a valid response code
guard let resCode = (response as? NSHTTPURLResponse)?.statusCode where resCode == 200 else {
return NSError(domain: "Error with request", code: 1, userInfo: [NSLocalizedDescriptionKey: "Recieved the following status code: \(resCode)"])
}
我尝试在guard语句的主体中使用变量resCode
时发生错误。
答案 0 :(得分:9)
如错误所述,您不能使用绑定在guard语句主体内的guard语句中的变量。该变量仅在未输入保护体的情况下受到约束。您也没有区分您的回复为零且状态代码不是200的情况。
您应该将陈述分为两个不同的检查:
guard let httpResponse = response as? NSHTTPURLResponse else {
return NSError(domain: "Error with request", code: 1, userInfo: [NSLocalizedDescriptionKey: "Invalid response: \(response)"])
}
guard httpResponse.statusCode == 200 else {
return NSError(domain: "Error with request", code: 1, userInfo: [NSLocalizedDescriptionKey: "Recieved the following status code: \(httpResponse.statusCode)"])
}
不要以牺牲可读性或正确性为代价来尽量减少代码行数。