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

swift 3是否与iOS 9上的NSURL类不兼容?,ios,ios9,nsurl,swift3,ios10,Ios,Ios9,Nsurl,Swift3,Ios10,我正在迁移我的Swift 2.2代码构建,并在xcode 7/ios 8和ios 9上运行良好。 自Swift 3起,它与iOS 8及更高版本兼容。我也知道我将无法使用更新的API 在我的应用程序中,我创建了一些https请求,下载了一些文件等 我的假设是,我还应该能够使用类NSURL、URLSessionDownloadDelegate、NSMutableURLRequest等,所有这些都可以从iOS(8.0及更高版本)获得 但我(显然)在iOS 8.1上运行迁移的代码时遇到了崩溃,因为我使用

我正在迁移我的Swift 2.2代码构建,并在xcode 7/ios 8和ios 9上运行良好。 自Swift 3起,它与iOS 8及更高版本兼容。我也知道我将无法使用更新的API

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

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

但我(显然)在iOS 8.1上运行迁移的代码时遇到了崩溃,因为我使用了URL类(可从iOS 10获得),或者编译器抱怨“NSURL”不能隐式转换为“URL”(另请参见)

因此,如果我想与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代码中,我得到以下错误:

  • 在with:let request=…:'NSURL'行不能隐式转换为'URL';您的意思是使用“as”来显式转换吗
  • 在let urlString=….的行中:无法将类型为'NSURL'的值转换为预期的参数类型'URL'
  • 我不能将localFileURL与URL类型一起使用,因为这将是仅限IOS10的。 我也不能用URLRequest代替NSMutableURLRequest,因为它也只能从iOS(10.0及更高版本)上获得。似乎我总是以某种方式使用URL类型的URL,而不是“旧”NSURL

    所以我的问题是:有没有办法将NSURL等人与swift 3和iOS 9一起使用

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

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

    多亏了我可以回答自己的问题:

    该代码在URL类中运行良好,但仅当您将Deplyment目标设置为与模拟器相同的iOS版本时

    XCode 8将我的iOS 9 SDK更新为版本10,因此我只能选择在iOS 10或iOS 8.1上使用模拟器。然而,部署目标被设置为ios9(我很确定这是在升级到ios8.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"
     [...]
    
    }
    
    谢谢大家!

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

    该代码在URL类中运行良好,但仅当您将Deplyment目标设置为与模拟器相同的iOS版本时

    XCode 8将我的iOS 9 SDK更新为版本10,因此我只能选择在iOS 10或iOS 8.1上使用模拟器。然而,部署目标被设置为ios9(我很确定这是在升级到ios8.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"
     [...]
    
    }
    

    谢谢大家!

    >您可以轻松地将基础和快捷类型(例如,代码> URLSTORD作为URL < /代码>,在代码< > <代码>之后不发出感叹号/问号。这是错误的:我不能使用URL类型URL,因为这只是IOS 10。使用
    URL
    URLRequest
    的应用程序在iOS 9设备上运行没有问题。
    Availability
    注释有点令人困惑,但如果您正确设置部署目标,Xcode/Swift将警告您实际上不可用的东西。尝试使用
    URL
    URLRequest
    并在实际的iOS 9设备上进行测试。谢谢!你的暗示把我带到了正确的方向!这些可用性说明确实令人困惑。我现在可以回答我自己的问题。您可以轻松地将基础和快捷类型如<代码> URLSTORD作为URL<代码>,在代码> > <代码>后不发出感叹号/问号。这是错误的:我不能使用URL类型URL,因为这只是iOS 10。使用
    URL
    URLRequest
    的应用程序在iOS 9设备上运行没有问题。
    Availability
    注释有点令人困惑,但如果您正确设置部署目标,Xcode/Swift将警告您实际上不可用的东西。尝试使用
    URL
    URLRequest
    并在实际的iOS 9设备上进行测试。谢谢!你的暗示把我带到了正确的方向!这些可用性说明确实令人困惑。我现在可以回答我自己的问题了。