我的问题主要在于努力成为一名优秀的程序员,而不是我的代码不起作用。
在编写代码时,是否考虑了一些被认为足够好的东西(如最佳实践')?我将在下面给出一个URLSession示例。我知道Swift为你提供了工具!或者作为?,但有些东西告诉我,我们不应该这样做(或者有更好的方法)。我无法看到它们。例如,请考虑从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周围编写自己的包装器,并返回我的代码的其他部分可以使用的对象。我不知道AF人员如何解决这个问题。什么是Swift处理这个问题的方法?作为"最佳实践"?有没有更好的方法来获取HTTPURLResponse对象?
答案 0 :(得分:1)
首先,严格说来,基于块的API没有委托。
URLSessionDataTask
是一个非常通用的类,可以用于除HTTP请求之外的其他目的,因此响应对象是更通用的URLResponse
类,它是可选的。
如果是HTTP请求,API会返回更具体的子类HTTPURLResponse
,因此必须必须对象才能访问HTTPURLResponse
的特定属性,如{ {1}}。所以是的, 向下投射可以作为“最佳实践” 。
以下两个建议是一个更好的程序员
statusCode
代码中还有另一个严重错误:完成处理程序没有返回值,因此您将在void函数中获得编译器错误意外的非void返回值。
附注:由于文字字符串urlString
明确包含方案且是有效的URL,因此不需要检查方案和nil
。