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 代码中出现以下错误:
- 在以下行:let request = ...: 'NSURL' 不能隐式转换为 'URL';您是要使用 'as' 来显式转换吗?
- 在 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"
[...]
}
谢谢!
我正在迁移我的 Swift 2.2 代码构建并在 xcode 7 / ios 8 和 ios 9 上正常工作。
从
在我的应用程序中,我正在创建一些 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 代码中出现以下错误:
- 在以下行:let request = ...: 'NSURL' 不能隐式转换为 'URL';您是要使用 'as' 来显式转换吗?
- 在 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"
[...]
}
谢谢!