【发布时间】:2017-01-28 22:55:40
【问题描述】:
我正在迁移我的 Swift 2.2 代码构建并在 xcode 7 / ios 8 和 ios 9 上正常工作。 从the answer to this question 开始,Swift 3 与 iOS 8 和更新版本兼容。而且我也知道我将无法使用更新的 API。
在我的应用程序中,我正在创建一些 https 请求、下载一些文件等。
我的假设是我还应该能够使用 iOS(8.0 及更高版本)提供的所有类 NSURL、URLSessionDownloadDelegate、NSMutableURLRequest 等。
但是我(显然)在 iOS 8.1 上运行我的迁移代码时遇到了崩溃,因为我使用了 URL 类(可从 iOS 10 获得),或者编译器抱怨“NSURL”不能隐式转换为“URL”(另请参阅this question)。
因此,如果我想与 iOS 9 兼容,我无法使用 URL 类。
这里有一些代码可以让事情更清楚:
斯威夫特 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"
}
斯威夫特 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 代码中出现以下错误:
- 在一行:让请求= ...:'NSURL'不能隐式转换为'URL';您的意思是使用 'as' 来显式转换吗?
- 在 let urlString = ... 行:无法转换“NSURL”类型的值?到预期的参数类型“URL?”
我不能使用带有 URL 类型的 localFileURL,因为这仅适用于 iOS 10。 我也不能使用 URLRequest 代替 NSMutableURLRequest,因为它也只能从 iOS(10.0 及更高版本)获得。似乎我总是以某种方式使用 URL 类型的 URL,而不是“旧”的 NSURL。
所以我的问题是:有没有 任何 方法来使用 NSURL 等。人。使用 swift 3 和 iOS 9?
或者更一般地说,有没有一种方法可以在 iOS 9 和 iOS 10 上使用 swift 3 进行后台下载?
这种不一致是否来自 NSURLComponents 到 URLComponents 的桥接?
【问题讨论】:
-
您可以轻松地连接 Foundation 和 Swift 类型,例如
urlString as URLas后面不带感叹号/问号 -
这是错误的:我不能使用带有 URL 类型的 localFileURL,因为这仅适用于 iOS 10。 使用
URL或URLRequest的应用程序在 iOS 9 设备上运行没有问题。Availability的注释有点令人困惑,但如果你正确设置了部署目标,Xcode/Swift 会警告你实际上不可用的东西。尝试使用URL和URLRequest并在实际的iOS 9 设备上进行测试。 -
感谢 OOPer!你的提示把我带到了正确的方向!这些可用性说明确实令人困惑。我现在可以回答我自己的问题了。
标签: ios ios9 nsurl swift3 ios10