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

时间:2016-09-20 21:18:09

标签: ios ios9 nsurl swift3 ios10

我正在迁移我的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类。

以下是一些使事情更清晰的代码:

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&#39 ;;你的意思是使用'作为'明确转换?
  2. 在let urlString = ...的行中:无法转换类型' NSURL的值?'预期参数类型' URL?'
  3. 我不能将localFileURL与类型URL一起使用,因为这只是iOS 10。 我也不能使用URLRequest而不是NSMutableURLRequest,因为它也只能从iOS(10.0及更高版本)获得。似乎我总是使用URL类型的URL,而不是" old" NSURL。

    所以我的问题是:是否有任何方式使用NSURL等。人。使用swift 3 iOS 9?

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

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

1 个答案:

答案 0 :(得分:0)

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

代码可以正常使用URL类,但只有当您将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时,它确实工作

以下是适用于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"
 [...]

}

谢谢!

相关问题