Swift 3.0向下铸造和最佳实践

时间:2017-07-24 01:50:37

标签: swift

我的问题主要在于努力成为一名优秀的程序员,而不是我的代码不起作用。

在编写代码时,是否考虑了一些被认为足够好的东西(如最佳实践')?我将在下面给出一个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对象?

1 个答案:

答案 0 :(得分:1)

首先,严格说来,基于块的API没有委托。

URLSessionDataTask是一个非常通用的类,可以用于除HTTP请求之外的其他目的,因此响应对象是更通用的URLResponse类,它是可选的。

如果是HTTP请求,API会返回更具体的子类HTTPURLResponse,因此必须必须对象才能访问HTTPURLResponse的特定属性,如{ {1}}。所以是的, 向下投射可以作为“最佳实践”

以下两个建议是一个更好的程序员

  1. 变量名应该以小写字母开头,例如statusCode
  2. 正如评论中已经提到的,使用比单个字符更多的描述性变量名称。
  3. 代码中还有另一个严重错误:完成处理程序没有返回值,因此您将在void函数中获得编译器错误意外的非void返回值

    附注:由于文字字符串urlString明确包含方案且是有效的URL,因此不需要检查方案和nil