swift 3 与 iOS 9 上的 NSURL 类 不兼容吗?

Is swift 3 not compatible with NSURL classes on iOS 9?

我正在迁移我的 Swift 2.2 代码构建并在 xcode 7 / ios 8 和 ios 9 上正常工作。 从 Swift 开始,3 与 iOS 8 及更新版本兼容。而且我也知道我将无法使用更新的 API。

在我的应用程序中,我正在创建一些 https 请求、下载一些文件等。

我的假设是我也应该能够使用 classes NSURL、URLSessionDownloadDelegate、NSMutableURLRequest 等,所有这些都可以从iOS(8.0 及更高版本)。

但是要么我(显然)运行 崩溃了 运行 在 iOS 8.1 上迁移了我的代码,因为我使用了 URL class (可从 iOS 获得 10) 或编译器抱怨 'NSURL' 不能隐式转换为 'URL'(另见 )。

因此我无法使用 URL class,如果我想兼容 iOS 9.

这里有一些代码可以让事情更清楚:

Swift 2:

class ServerCom: NSObject, NSURLSessionDownloadDelegate {
   private var fileURL: NSURL = NSURL()
    [...]       
           guard let urlString: NSURL =
        NSURL(string: params,
            relativeToURL: NSURL(string: dcParam.baseURL) )  else {
                let failed = "Could not generate URL from: \(dcParam.baseURL)\(params)"
                throw fetchAppXmlError.FAILED_URL_GENERATION(failed)
    }
    [...]
    let request = NSMutableURLRequest(URL: urlString)
    request.timeoutInterval = 10
    request.HTTPMethod = "GET"

}

Swift 3

class ServerCom: NSObject, URLSessionDownloadDelegate {

 fileprivate var localFileURL: NSURL = NSURL()

 [...]

         guard let urlString: NSURL =
            NSURL(string: params,
                relativeTo: NSURL(string: dcParam.baseURL) )  else {
                    let failed = "Could not generate URL from: \(dcParam.baseURL)\(params)"
                    throw fetchAppXmlError.failed_URL_GENERATION(failed)
        }

 let request = NSMutableURLRequest(url: urlString)
 request.timeoutInterval = 10
 request.httpMethod = "GET"
 [...]

}

在 swift 3 代码中出现以下错误:

  1. 在以下行:let request = ...: 'NSURL' 不能隐式转换为 'URL';您是要使用 'as' 来显式转换吗?
  2. 在 let urlString = ... 的行:无法将类型 'NSURL?' 的值转换为预期的参数类型 'URL?'

我不能将 localFileURL 与类型 URL 一起使用,因为这只会是 iOS 10。 我也不能使用 URLRequest 而不是 NSMutableURLRequest,因为它也只能从 iOS(10.0 及更高版本)获得。似乎我总是以某种方式使用 URL 类型的 URL 而不是 "old" NSURL.

所以我的问题是:是否有 any 方法来使用 NSURL 等。阿尔。用 swift 3 iOS 9?

或者更一般地说,有没有一种方法可以在 iOS 9 和 iOS 10 上使用 swift 3 进行后台下载?

这种不一致是否来自 NSURLComponents 到 URLComponents 的桥接?

感谢 OOPer 我可以回答我自己的问题:

代码在 URL class 上运行良好,但只有当您将 Deplyoment Target 设置为与您的 相同 iOS 版本时模拟器!

XCode 8 将我的 iOS 9 SDK 更新到版本 10,因此我只能选择在 iOS 10 或 iOS 8.1 上使用模拟器。但是,部署目标设置为 iOS 9(我很确定它是在升级设置为 iOS 8.1 之前)。

所以我 运行 使用 iOS 8.1 模拟器和部署目标设置为 iOS 9.运行 时间错误。

但它工作 iOS 8.1 模拟器 部署目标设置为 iOS 8.1!

这是 Swift 3 代码也适用于 iOS 8.1:

class ServerCom: NSObject, URLSessionDownloadDelegate {

fileprivate var localFileURL: URL = URL(string: "dummy")!

 [...]

         guard let urlString: URL =
            URL(string: params,
                relativeTo: URL(string: dcParam.baseURL) )  else {
                    let failed = "Could not generate URL from: \(dcParam.baseURL)\(params)"
                    throw fetchAppXmlError.failed_URL_GENERATION(failed)
        }

        var request = URLRequest(url: urlString)
        request.timeoutInterval = 10
        request.httpMethod = "GET"
 [...]

}

谢谢!