我的问题主要是试图成为一个更好的程序员,而不是我的代码行不通。
编写代码时,向下转换是否被认为足够好(如“最佳实践”中所述)?我在下面用URLSession给出一个例子。我了解Swift可以为您提供实现这一目标的工具!或as ?,但有一个告诉我我们不应该这样做(或者有更好的方法可以做到)。我只是看不到他们。例如,考虑以下代码,该代码从HTTP GET请求中检索网页:
guard let url = URL(string: apiEndpoint) else {
return
}
if let scheme = url.scheme {
if scheme != "http" || scheme != "https" {
return
}
}
// More code
URLSession.shared.dataTask(with: url) { (data, response, error) in
if let err = error {
// Error handling here
}
else {
guard let httpResponse = response as? HTTPURLResponse else {
return
}
// Code here
}
}.resume()
因此,上面的代码有效,但是我的问题在
guard let httpResponse = response as? HTTPURLResponse
语句上。 dataTask
应该将URLResponse
对象返回给委托,在本例中为我的变量response
。但是,此类显然没有状态码。因此,如果执行以下操作,Swift将给我一个编译错误:guard let httpResponse = response else {
return nil
}
statusCode = response.statusCode
因为
response
应该是URLResponse对象,所以它无法通过Xcode的检查。为了获得该信息,我需要使用as强制转换为HTTPURLResponse。 (我已经检查了请求是否是http / https之前的版本),或者像上面一样检查了可选内容。
现在,我不想使用像Alamofire这样的大型包装器,因为我的API非常简单。我想围绕URLResponse编写自己的包装器,并返回一个代码我的其他部分可以使用的对象。我不知道自动对焦人员如何解决这个问题。 Swift的处理方式是什么?作为一种“最佳实践”,是否精打细算?有没有更好的方法来获取HTTPURLResponse对象?
最佳答案
首先,严格来说,基于块的API没有委托。URLSessionDataTask
是一个用途广泛的类,可以用于HTTP请求之外的其他目的,因此响应对象是更通用的URLResponse
类,并且是可选的。
如果有HTTP请求,则API返回更具体的子类HTTPURLResponse
,因此必须将对象强制转换为对HTTPURLResponse
的特定属性(如statusCode
)的访问权限。因此,是的,“最佳做法”是精铸的。
这是成为更好的程序员的两个建议
变量名称应该以小写字母开头,例如urlString
如评论中已经提到的,使用比单个字符更多的描述性变量名。
代码中还有另一个严重错误:完成处理程序没有返回值,因此您将得到编译器错误void函数中的意外非无效返回值。
旁注:不需要检查方案和nil
,因为文字字符串https://www.google.com
显然包含方案,并且是有效的URL。