gpt4 book ai didi

Swift 3.0 向下转换和最佳实践

转载 作者:行者123 更新时间:2023-11-30 10:00:48 24 4
gpt4 key购买 nike

我的问题主要是想成为一名更好的程序员,而不是我的代码不起作用。

在编写代码时,向下转型是否被认为足够好(如“最佳实践”)?下面我将用 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 对象返回给委托(delegate),在本例中是我的变量 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 对象?

最佳答案

首先,严格来说,基于 block 的 API 没有委托(delegate)。

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

如果是 HTTP 请求,API 将返回更具体的子类 HTTPURLResponse,因此对象必须向下转换才能访问 HTTPURLResponse 的特定属性 就像statusCode。所以,是的,向下转换作为“最佳实践”是很好的

这里有两条建议成为更好的程序员

  1. 变量名称应该以小写字母开头,例如urlString
  2. 正如评论中已经提到的,使用比单个字符更具描述性的变量名称。

代码中还有另一个严重错误:完成处理程序没有返回值,因此您将收到编译器错误void函数中出现意外的非void返回值

旁注:不需要检查方案和 nil,因为文字字符串 https://www.google.com 明确包含方案和是一个有效的 URL。

关于Swift 3.0 向下转换和最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45271562/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com