【问题标题】:Is swift 3 not compatible with NSURL classes on iOS 9?swift 3 与 iOS 9 上的 NSURL 类不兼容吗?
【发布时间】: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 代码中出现以下错误:

  1. 在一行:让请求= ...:'NSURL'不能隐式转换为'URL';您的意思是使用 'as' 来显式转换吗?
  2. 在 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。 使用 URLURLRequest 的应用程序在 iOS 9 设备上运行没有问题。 Availability 的注释有点令人困惑,但如果你正确设置了部署目标,Xcode/Swift 会警告你实际上不可用的东西。尝试使用URLURLRequest 并在实际的iOS 9 设备上进行测试。
  • 感谢 OOPer!你的提示把我带到了正确的方向!这些可用性说明确实令人困惑。我现在可以回答我自己的问题了。

标签: ios ios9 nsurl swift3 ios10


【解决方案1】:

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

该代码适用于 URL 类,但仅当您将部署目标设置为与您的模拟器相同 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!

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

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"
 [...]

}

谢谢!

【讨论】:

    猜你喜欢
    • 2017-01-27
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 2016-12-06
    • 2017-06-06
    • 2022-01-05
    相关资源
    最近更新 更多